设计原则是设计模式的评判标准。面向对象的设计原则有七个,包括:开闭原则、里氏替换原则、迪米特原则(最少知道原则)、单一职责原则、接口分隔原则、依赖倒置原则、组合/聚合复用原则。极客教程提供的设计原则教程栏目会为大家深入浅出地介绍这七种设计原则。
七大原则之间并不是相互孤立的,彼此间存在着一定关联,一个可以是另一个原则的加强或是基础。违反其中的某一个,可能同时违反了其余的原则。
开闭原则是面向对象的可复用设计的基石。其他设计原则是实现开闭原则的手段和工具。
一般地,可以把这七个原则分成了以下两个部分:
开闭原则(Open Close Principle,OCP)
- 对扩展开放,对更改关闭
- 类模块应该是可扩展的,但是不可修改。
开闭原则要求通过扩展来满足需求的变化,而不是更改。
开闭原则详解请阅读:极客教程解析的开闭原则
里氏代换原则(Liskov Substitution Principle, LSP)
- 子类必须能够替换它们的基类(IS-A)
- 继承表达类型抽象
里氏代换原则详解请阅读:极客教程里氏代换原则
迪米特原则(Law of Demeter, LoD)
迪米特原则是1987年秋天由lan holland在美国东北大学一个叫做迪米特的项目设计提出的,它要求一个对象应该对其他对象有最少的了解,所以迪米特法则又叫做最少知识原则(Least Knowledge Principle, LKP)。
迪米特原则详解请阅读:极客教程迪米特原则
单一职责原则(Single Responsibility Principle, SRP)
- 一个类应该仅有一个引起它变化的原因
- 变化的方向隐含着类的责任
单一职责原则详解请阅读:极客教程单一职责原则
接口分离原则(Interface Segregation Principle,ISP)
- 不应该强迫客户程序依赖它们不用的方法
- 接口应该小而完备
接口分离原则详解请阅读:极客教程接口分离原则
依赖倒置原则(Dependence Inversion Principle, DIP)
- 高层模块(稳定)不应该依赖于低层模块(变化),二者都应该依赖于抽象(稳定)
- 抽象(稳定)不应该依赖于实现细节(变化),实现细节应该依赖于抽象(稳定)
依赖倒置原则详解请阅读:极客教程依赖倒置原则
组合/聚合复用原则(Composite/Aggregate Reuse Principle CARP)
- 尽量使用组合/聚合,不要使用类继承
- 在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分,新对象通过向这些对象的委派达到复用已有功能的目的。就是说要尽量的使用合成和聚合,而不是继承关系达到复用的目的
组合/聚合复用原则详解请阅读:极客教程组合/聚合复用原则
各种原则要求的侧重点不同,总地来说:
- 开闭原则是核心,对扩展开放对修改关闭是软件设计、后期扩展的基石
-
单一职责原则要求我们设计接口,制定模块功能时保持模块或者接口功能单一,接口设计或功能设计尽量保持原子性,修改一处不能影响全局或其它模块
-
里氏替换原则和依赖倒置原则,按照作者的理解,这俩原则总的是要求我们要面向接口、面向抽象编程,设计程序的时候尽可能使用基类或者接口进行对象的定义或引用,而不是具体的实现,否则实现一旦有变更,上层调用者就必须做出对应变更,这样一来,整个模块可能都需要重新调整,非常不利于后期拓展
-
接口隔离原则具体应用到程序中,比如我们在传统 MVC 开发时,Service 层调用 DAO 层一般会使用接口进行调用,各层之间尽量面向接口通信,其实也是一种降低模块耦合的方法
-
迪米特法则的初衷也是为了降低模块耦合,代码示例中我们引入了类似 “中间人” 的概念,上层模块不直接调用下层模块,而是引入第三方进行代办,这也是为了降低模块的耦合度
-
组合/聚合复用原则,聚合是一种弱关联,而组合是一种强关联,表现在 UML 类图上的话聚合是使用空心四边形加箭头表示,而组合是使用实心四边形加箭头表示,合成复用原则总的就是要求我们尽量利用好已有对象,从而达到功能复用,具体是聚合还是组合,还是一般关联,就要看具体情况再定了
这 7 种设计原则是软件设计必须尽量遵循的原则。