设计模式六大设计原则
(一)单一职责原则【Single Responsibility Principle】
单一职责原则:应该有且仅有一个原因引起类的变更。
(二)里氏替换原则【Liskov Substitution Principle】
里氏替换法则有两种定义:
(1)如果对每一个类型为 T1 的对象 o1,都有类型为 T2 的对象 o2,使得以 T1 定义的所有程序 P 在所有的对象 o1 都代换成 o2 时,程序 P 的行为没有发生变化,那么类型 T2 是类型 T1 的子类型。
(2)所有引用基类的地方必须能透明地使用其子类的对象。
我们在类中调用其他类是务必要使用父类或接口,如果不能使用父类或接口,则说明类的设计已经违背了 LSP 原则。
(三)依赖倒置原则【Dependence Inversion Principle】
依赖倒置原则包含三层含义:
(1) 高层模块不应该依赖低层模块,两者都应该依赖其抽象。
(2) 抽象不应该依赖细节。
(3) 细节应该依赖抽象。
(四)接口隔离原则【Interf ace Segregation Principle】
接口尽量要小。这是接口隔离原则的核心定义,不出现臃肿的接口(Fat Interface),但是“小”是有限度的,首先就是不能违反单一职责原则。根据接口隔离原则拆分接口时,必须首先满足单一职责原则。
接口要高内聚。什么是高内聚?高内聚就是提高接口、类、模块的处理能力,减少对外的交互。
定制服务。一个系统或系统内的模块之间必然会有耦合,有耦合就要相互访问的接口,我们设计时就需要给各个访问者(也就客户端)定制服务。
接口设计是有限度的。接口的设计粒度是越小系统越灵活,这是不争的事实,但是这就带来的结构的复杂化,开发难度增加,维护性降低,这不是一个项目或产品所期望看到的,所有接口设计一定要注意适度。
(五)迪米特法则【Low Of Demeter】
迪米特法则(Law of Demeter)又叫作最少知道原则(Least Knowledge Principle 简写LKP),就是说一个对象应当对其他对象有尽可能少的了解,不和陌生人说话。英文简写为: LoD.。
狭义的迪米特法则的缺点:
在系统里造出大量的小方法,这些方法仅仅是传递间接的调用,与系统的商务逻辑无关。
遵循类之间的迪米特法则会是一个系统的局部设计简化,因为每一个局部都不会和远距离的对象有直接的关联。但是,这也会造成系统的不同模块之间的通信效率降低,也会使系统的不同模块之间不容易协调。
门面模式和调停者模式实际上就是迪米特法则的应用。
广义的迪米特法则在类的设计上的体现:
优先考虑将一个类设置成不变类。
尽量降低一个类的访问权限。
谨慎使用Serializable。
尽量降低成员的访问权限。
(六)开闭原则【Open Close Principle】
关于开放封闭原则,其核心的思想是:
软件实体应该是可扩展,而不可修改的。也就是说,对扩展是开放的,而对修改是封闭的。
因此,开放封闭原则主要体现在两个方面:
对扩展开放,意味着有新的需求或变化时,可以对现有代码进行扩展,以适应新的情况。
对修改封闭,意味着类一旦设计完成,就可以独立完成其工作,而不要对类进行任何修改。
规则建议:
开放封闭原则,是最为重要的设计原则,Liskov替换原则和合成/聚合复用原则为开放封闭原则的实现提供保证。
可以通过Template Method模式和Strategy模式进行重构,实现对修改封闭、对扩展开放的设计思路。
封装变化,是实现开放封闭原则的重要手段,对于经常发生变化的状态一般将其封装为一个抽象,例如银行业务中的IBankProcess接口。
拒绝滥用抽象,只将经常变化的部分进行抽象,这种经验可以从设计模式的学习与应用中获得。