我们在设计一些设计模式时,一般遵循如下七项基本原则,它们分别是:
一、开放-封闭原则(Open-Closed Principle)
定义:软件实体(类、模块、函数等等)应该可以扩展,但是不可修改。
顾名思义,对扩展是开放的,对更改是封闭的。
我们很难预先猜测程序会发生的变化,但可以在发生小变化的时候,通过构造抽象隔离以后发生的同类变化。
面向需求,对程序的改动是通过增加新代码进行的,而不是更改现有的代码。
二、单一职责原则 (Single Responsibility Principle)
定义:对于一个类而言,应该仅有一个引起它变化的原因。
如果一个类承担的职责过多,就等于把这些指责耦合在一起,一个职责的变化可能会削弱或抑制这个类完成其他职责的能力。这种耦合会导致脆弱的设计,但变化发生时,设计或遭到意想不到的破坏。
如果你能想到多于一个动机去改变一个类,这个类就有多于一个的职责。
三、依赖倒置原则(Dependence Inversion Principle)
定义:
A. 高层模块不应该依赖低层模块,两个模块都应该依赖抽象。
B. 抽象不应该依赖细节,细节应该依赖抽象。
针对接口编程,不要对实现编程。
四、里氏代换原则(Liskov Substitution Principle)
定义:子类型必须能够替换掉他们的父类型。
一个软件实体如果使用的是一个父类的话,那么一定适用于其子类,而且它察觉不出父类对象和子类对象的区别。也就是说在软件里面,把父类都替换成它的子类,程序的行为没有改变。
例子:企鹅不会飞,不能继承鸟类
五、迪米特法则(Law Of Demeter)
定义:如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。如果其中一个类需要调用另一个类的某一个方法的话,可以通过第三者转发调用。
在类的结构设计上,每一个类都应当尽量降低成员的访问权限。
强调类之间的松耦合。
六、组合/聚合复用原则 (Composite/Aggregate Reuse Principle)
定义:尽量使用组合/聚合,尽量不要使用类继承。
聚合表示弱的拥有关系,A对象可以包含B对象,但B对象不是A对象的一部分。
组合表示强的拥有关系,严格的部分和整体的关系,部分和整体的生命周期一样。
例子:翅膀和大雁是组合关系,大雁和雁群是聚合关系。
优先使用对象的组合/聚合有助于保持每个类被封装,并被集中在单个任务上。类和类继承层次会保持较小规模,并且不太可能增长为不可控制的庞然大物。
七、接口隔离原则 (Interface Segregation Principle)
定义:客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。
例:类 A 依赖于 接口 I 中的方法 1,2,3 ,类 B 是对类 A 的具体实现。类 C 依赖接口 I 中的方法 1,4,5,类 D 是对类 C 的具体实现。对于类B和类D来说,虽然他们都存在着用不到的方法(也就是图中红色字体标记的方法),但由于实现了接口I,所以也必须要实现这些用不到的方法。