设计模式五大原则 SOLID
单一职责原则(SRP)
- 对一个类,应该仅有一个引起它变化的原因
- 把职责定义为“变化的原因”(a reason for change),如果你能够想到多于一个的动机去改变一个类,那么这个类就具有多于一个的职责
- 软件设计真正要做的许多内容,就是发现职责并把那些职责相互分离
开放-封闭原则(OCP)
- 软件实体(类、模块、函数等等)应该是可以扩展的,但是不可修改的
- 模块的行为是可以扩展的,扩展时,不必改动模块的源代码或二进制代码
- 关键是抽象,把一个功能的通用部分和实现细节的部分清晰地分离开来
- 对程序中频繁变化的那些部分进行抽象
- 拒绝不成熟的抽象和抽象本身一样重要
- OCP是OOD的核心
Liskov替换原则(LSP)
- 子类型(subtype)必现能够替换掉它们的基类型(base type)
- 若对每个类型S的对象O1,多存在一个类型T的对象O2,使得在所有针对T编写的程序P中,用O1替换O2后,程序P行为功能不变,则S是T的子类型
- LSP是使OCP成为可能的主要原则之一,真是子类型的可替换性才使得使用基类类型的模块在无需修改的情况下就可以扩展
依赖倒置原则(DIP)
- 高层模块不应该依赖于底层模块。二者都应该依赖于抽象
- 抽象不应该依赖于细节。细节应该依赖于抽象
- 高层模块独立于低层模块,那么高层模块可以非常容易地被重用,改原则是框架(framework)设计的核心原则
- 层次化,所有结构良好的面向对象架构都具有清晰的层次定义,每个层次通过一个定义良好的、受控的接口想外提供一组内聚的服务
- 每个较高层次都为它所需要的服务声明一个抽象接口,较低的层次实现了这些抽象接口,每个高层类都通过该抽象接口使用下一层,这样高层就不依赖低层,低层反而依赖于在高层中声明的抽象服务接口
- Dont call us, we'll call you
- 依赖于抽象,程序中所有的依赖关系都应该终止于抽象类或者接口:(1)任何变量都不应该持有一个指向具体类的指针或者引用;(2)任何类都不应该从具体类派生;(3)任何方法都不应该复写它的任何基类中的已经实现了的方法
- 依赖倒置是面向对象设计的标志所在,如果程序的依赖关系是倒置的,它就是面向对象的设计,如果不是倒置的,它就是过程化的设计
- 面向对象技术的底层机制,创建可重用框架所必须,构建适应需求变化的有弹性的代码,代码易维护
接口隔离原则(ISP)
- 不应该强迫客户依赖于他们不用的方法
- 如果类的接口不是内聚的(cohesive),就表示该类具有“胖”的接口
- 类的“胖”接口可以分解成多组方法,每一组方法都服务于一组不同的客户程序
- 胖类(fat class)会导致他们的客户程序之间产生不正常的并且有害的耦合关系,当一个客户程序要求该胖类进行一个改动,会影响到所有其它的客户程序