设计模式的 7 大原则

什么是设计模式?

设计模式即 Design Patterns,是指在软件开发过程中,针对反复出现的问题所总结归纳出的通用解决方案,设计模式是经过无数经验的积累和经验的总结得出的通用解决方案,设计模式都遵守了很多原则,这些原则可以提高代码的可重用性、可维护性和可扩展性。

设计模式的 7 大设计原则

单一职能原则(Single Responsibility Principle SRP)

单一职能原则 一个类应该只有一个引起变化的原因,换句话说,一个类应该只做一件事,这个原则鼓励将功能分解为小的、独立的单元,每个单元只负责一件事情。

单一职责原则的优点:

  • 可维护性强,当一个类只有一个职责时,它的代码逻辑相对简单和清晰,如果这个类出现问题或者需要修改,研发人员可以很容易地定位到问题。
  • 可读性强,单一职责的类功能明确,阅读者可以快速理解这个类的作用。
  • 方便进行单元测试,对于单一职责的类,可以针对它的唯一职责编写单元测试用例,可以提高测试的准确性和效率。

开放封闭原则(Open - Closed Principle,OCP)

开放封闭原则是面向对象设计的基本原则之一,它是由伯特兰・迈耶(Bertrand Meyer)在 1988 年提出的,简单来说,软件实体(类、模块、函数等)应该对扩展开放,对修改封闭,也就是说当需要对软件系统进行功能扩展时,我们应该通过添加新的代码(例如新的类或新的函数)来实现,而不是修改现有的、已经通过测试并且稳定运行的代码,因为修改已有的代码可能会引入新的错误,并且需要重新进行测试等一系列维护操作。

开放封闭原则优点:

  • 降低维护成本,提高系统的稳定性,遵循了开放封闭原则,对功能扩展是开放的,对功能修改是关闭的,因此系统中已有的代码很少会被修改,可以保证系统的稳定性。
  • 易于添加新功能,支持多样化的功能组合,因为开放封闭原则对功能扩展是开放的,因此新增新的业务功能的时候,很容易通过扩展来实现。
  • 在一定程度上可以提升代码的复用性,遵循了开放封闭原则后,每个功能模块的代码比较独立,可以更好的当代码在不同系统之间共享调用。

里氏替换原则(Liskov Substitution Principle,LSP)

里氏替换原则是面向对象设计中的一个基本原则。它是由芭芭拉・利斯科夫(Barbara Liskov)在 1987 年提出的。简单来说,它的核心思想是子类对象能够替换其父类对象,并且程序的功能和逻辑不会受到影响,在任何使用父类对象的地方,都可以使用其子类对象进行替换。

里氏替换原则优点:

  • 提高代码的可维护性,里氏替换原则强调的是子类和父类关系的正确性,子类的行为和父类是一致的,当我们需要扩展某个功能的时候,只需要在父类进行添加,就会自然而然的应用到子类上。
  • 新功能的添加比较容易,遵循里氏替换原则的设计很容易添加子类,当新添加一个功能的时候,新添加一个子类即可完成。
  • 逻辑一致,降低系统的风险,里氏替换原则可以保证系统中的各个子类和父类行为保持一致,有助于整个系统逻辑的连贯,降低系统出现错误的风险。

依赖倒置原则(Dependency Inversion Principle,DIP)

依赖倒置原则是面向对象设计的五大原则之一。它主要强调高层模块不应该依赖低层模块,二者都应该依赖其抽象,简单来说,就是在软件系统的设计中,要尽量依赖抽象类或接口,而不是具体的实现类,这样可以降低模块之间的耦合度,提高系统的可维护性和可扩展性。

依赖倒置原则优点:

  • 解耦模块依赖关系,依赖倒置原则使得高层模块和低层模块之间的依赖关系倒置,不再是高层模块直接依赖低层模块的具体实现。
  • 易于添加新的功能,支持多种实现的替换。
  • 提升代码的复用性,依赖倒置原则促使开发人员关注抽象层次的设计,抽象层次的设计可以提升底代码的复用率。

接口隔离原则(Interface Segregation Principle,ISP)

接口隔离原则是面向对象设计的五大原则之一。它指出客户端不应该被迫依赖于它不需要的接口,接口应该小而专注,不应该包含多余的的接口,而不能使用一个大的总接口。

接口隔离原则优点:

  • 接口隔离原则使得系统中的接口职责更加单一,实现类只需要关注自己真正需要实现的方法,从而提高了内聚性,降低了不同功能模块之间的耦合,这种高内聚低耦合的特性使得系统更加灵活,当需要对某个功能进行修改或扩展时,而不会影响到与矩形绘制等其他无关的功能模块。
  • 因为接口职责单一,所以代码的可读性和维护性更好,当系统出现问题时,定位问题也更加容易,研发人员可以很容易地理解每个接口的用途。
  • 代码的复用性更好,小而精的接口更容易被复用,同时接口隔离后,不同的功能模块可以根据自己的需求组合这些接口,也提升了代码的复用性。

迪米特法则(Law of Demeter,LoD)

迪米特法则(Law of Demeter,LoD)也称为最少知识原则(Least Knowledge Principle,LKP),迪米特法则强调一个对象应该对其他对象有最少的了解,对象之间应该松耦合,迪米特法则鼓励将复杂系统分解成较小的、相对独立的模块,而且模块之间的交互尽量简单。

迪米特法则优点:

  • 迪米特法则可以降低模块之间的耦合度,迪米特法则强调一个对象应该对其他对象有最少的了解,这使得各个模块之间的依赖关系更加简单和直接,降低了系统的耦合度。
  • 提高模块之间的可维护性和可扩展性,由于模块之间的耦合度降低,每个模块的职责更加明确,开发人员可以更容易地理解每个模块的功能和作用范围,在对系统进行维护或者扩展时,只需要关注相关模块本身,而不需要考虑过多的其他模块之间的复杂关联。
  • 增加了代码的可读性,遵循迪米特法则,会让模块之间的关系更加清晰,每个模块的代码主要处理与其直接相关的事务,减少了代码中的 “间接引用” 和 “远程依赖”,可以让代码的逻辑看起来更加清晰更容易理解。

合成/聚合复用原则(Composition/Aggregation Reuse Principle,CARP)

合成/聚合复用原则(Composition/Aggregation Reuse Principle,CARP)是面向对象设计中的一个重要原则,它主要用于指导软件系统中类之间的关系设计,以实现更好的软件复用性和可维护性,合成/聚合复用原则强调在软件设计中,应该优先使用合成和聚合关系来实现类之间的复用,而不是依赖继承来实现,因为继承关系可能会导致类之间的强耦合,子类紧密依赖于父类的实现细节,当父类的实现发生变化时,子类可能会受到很大的影响,而通过合成/聚合关系实现的类之间的耦合相对较弱,一个类的内部实现细节的改变对与之有合成/聚合关系的其他类的影响较小。

合成/聚合复用原则优点:

  • 遵循合成/聚合复用原则,类之间的耦合度相对较低。
  • 因为对象之间是通过合成/聚合的方式组合在一起的,各个对象的职责相对清晰,因此代码维护起来也相对更容易。
  • 合成/聚合复用原则相对更灵活,不同的应用程序可以根据自己的具体需求,通过配置或者替换其中的某些组件来满足特定的业务要求,
  • 这种复用方式比继承复用更加灵活,因为继承复用通常是基于特定的层次结构,而合成/聚合复用原则不受这种层次结构的限制,可以根据自己的业务需求自由搭配。

设计模式的缺点

设计模式 7大原则的缺点其实比较类似,就没有针对某种进行原则进行分析,后续在分析具体设计模式的时候会针对分析,这里给以一改概括的总结,如下:

  • 增加系统复杂度,运行时复杂性。
  • 设计模式实现难度问题。
  • 系统性能问题。
  • 接口和类数量膨胀问题。
  • 过度设计的风险。

总结:本篇简单分享设计模式的 7大原则,都是一些偏重概念性的东西,介绍了每种原则的概念和使用该原则的好处,将这些原则牢记在心可以让我们写出更优雅的代码,希望可以帮助到有需要的朋友。

如有不正确的地方欢迎各位指出纠正。

你可能感兴趣的:(设计模式,设计模式,设计模式原则,原理,设计模式7大原则,Java,面试)