下表是面向对象的几大设计原则
设计原则名称 | 定义 |
---|---|
单一职责原则(SRP) | 一个类,只负责一个功能领域中的相应职责 |
开闭原则(OCP) | 软件实体应对扩展开放,对修改关闭 |
里氏代换原则(LSP) | 所有引用父类对象的地方能够透明的使用其子类的对象 |
依赖倒转原则(DIP) | 抽象不应该依赖于细节,细节应该依赖于抽象 |
接口隔离原则(ISP) | 使用多个专门的接口,而不使用单一的总接口 |
合成复用原则(CRP) | 尽量使用对象组合,而不是集成来达到复用的目的 |
迪米特原则(LOD) | 一个软件实体类应当尽可能少地与其他实体发生相互作用 |
1. 单一职责原则(SRP)
-
解耦,增强内聚性(高内聚,低耦合)。
-
如果你把多个功能放在一个类中,功能之间就形成了关联,改变其中一个功能,有可能终止另一个功能,这时可能需要新一轮的测试来避免可能出现的问题
-
举个例子,我们在绘制图案的时候,用“点”和用“直线”组成图,哪个更灵活点呢?当然是“点”。所以单一职责原则,代表把设计类的时候,尽可能拆分到最小单位,解决复用和组合问题
2. 开闭原则(OCP)
-
对扩展开放,对修改关闭
-
在设计一个模块(类,方法)的时候,应该可以在不修改原有的模块(修改关闭)的基础上,能扩展其功能(扩展开放)。
-
我们写完的代码,不能因为需求变化就修改。我们通过新增代码的方式来解决变化的需求。这是一种理想状态,在现实中,我们需要尽可能的缩小这种修改。
3. 里氏代换原则(LSP)
- 子类应当可以替换父类,并出现在父类能够出现的任何地方。子类必须完全实现父类的方法。在类中调用其他类时务必要使用父类或接口,如果不能使用父类或接口,则说明类的设计违背了LSP原则
- 子类可以有自己的方法和属性
- 覆盖或实现父类的方法时,调用入参应比父类中的大。这样在子类替换父类的时候,调用的仍是父类的方法
- 覆盖或实现父类的方法时,输出结果可以被缩小
4. 依赖倒转原则(DIP)
- 高层模块不应该依赖低层模块,两者都应该依赖其抽象(抽象类或接口)
- 抽象不应该依赖细节(具体实现)。细节应该依赖于抽象
5. 接口隔离原则(ISP)
- 不应该强制客户程序依赖它们不需要使用的方法
- 一个接口应该只提供一种对外的行为,不应该把所有的操作都封装到一个接口中
6. 合成复用原则(CRP)
-
在一个新对象里面使用一些已有的对象,使之成为新对象的一部分
-
新的对象通过委派达到复用已有功能的目的
7. 迪米特原则(LOD)
-
又叫最少知识原则,一个对象应当对其他对象有尽可能少的了解
-
降低各个对象之间的耦合,提高系统的可维护性;在模块之间只通过接口来通信,而不理会模块内部的工作原理
-
尽量的封装,尽量的独立,尽量的使用低级别的修饰符。