设计模式6大设计原则
1. 单一职责原则
定义
单一职责原则(SRP:Single responsibility principle)又称单一功能原则。它规定一个类应该只有一个发生变化的原因。
阐述
单一职责适用于接口、类、方法。顾名思义,就是要求一个接口或类只有一个职责,它就负责一件事情。
好处
- 类的复杂性降低,有清晰明确的定义
- 提高了可读性和可维护性
- 使得变更引起的风险降低
注意
职责没有一个量化的标准,并且受非常多因素的制约,现实中实现起来会有困难。
2. 里氏替换原则
定义1
如果对每一个类型为S的对象o1,都有类型为T的对象o2,使得以T定义的所有程序P在所有的对象o1都代替成o2时,程序P的行为没有发生变化,那么类型S是类型T的子类型。
定义2
所有引用基类的地方必须能透明地使用其子类的对象。
阐述
通俗点讲,只要父类能出现的地方子类就可以出现,而且替换为子类也不会产生任何错误或异常,使用者可能根本就不需要知道是父类还是子类。
里氏替换原则的4层含义
- 子类必须完全实现父类的方法
- 子类可以有自己的个性
- 覆盖或实现父类的方法时输入参数可以被放大
- 覆写或实现父类的方法时输出结果可以被缩小
3. 依赖倒置原则
定义
依赖倒置原则(Dependence Inversion Principle,DIP),包含三层含义:
- 高层模块不应该依赖低层模块,两者都应该依赖其抽象
- 抽象不应该依赖细节
- 细节应该依赖抽象
在Java语言中的表现
- 模块间的依赖通过抽象发生,实现类之间不发生直接的依赖关系,其依赖关系是通过接口或抽象类产生的;
- 接口或抽象类不依赖于实现类;
- 实现类依赖接口或抽象类。
好处
采用依赖倒置原则可以减少类间的耦合性,提高系统的稳定性,降低并行开发引起的风险,提高代码的可读性和可维护性。
实践方法
- 每个类尽量都有接口或抽象类,或者抽象类和接口两者都具备
- 变量的表面类型尽量是接口或者是抽象类(有些不必,如xxxUtil类等)
- 任何类都不应该从具体类派生,尽量不要覆写基类的方法
结合里氏替换原则
接口负责定义public属性和方法,并且声明与其他对象的依赖关系,抽象类负责公共构造部分的实现,实现类准确的实现业务逻辑,同时在适当的时候对父类进行细化。
在项目中,大家只要记住是“面向接口编程”就基本上抓住了依赖倒置原则的核心。
4. 接口隔离原则
定义
- 客户端不应该依赖它不需要的接口
- 类间的依赖关系应该建立在最小的接口上
阐述
接口隔离原则与单一职责的审视角度是不相同的,单一职责要求的是类和接口职责单一,注重的是职责,这是业务逻辑上的划分,而接口隔离原则要求接口的方法尽量少。
结构隔离原则的4层原则
- 接口要尽量小
- 接口要高内聚
- 定制服务(单独为一个个体提供优良的服务)
- 接口设计是有限度的(灵活设计接口粒度大小)
5. 迪米特法则
定义
迪米特法则(Law of Demeter,LoD)也称为最少知识原则(Least Knowledge Principle,LKP):一个对象应该对其他对象有最少的了解。
阐述
通俗地讲,一个类应该对自己需要耦合或调用的类知道得最少,你(被耦合或调用的类)的内部是如何复杂都和我没关系,那是你的事情,我就知道你提供的这么多public方法,我就调用这么多,其他的我一概不关心。
迪米特法则的几层含义
- 只和朋友交流(出现在成员变量、方法的输入输出参数中的类称为成员朋友类,而出现在方法体内部的类不属于朋友)
- 朋友间也是有距离的
- 是自己的就是自己的(如果一个方法放在本类中,既不增加类间关系,也对本类不产生负面影响,就放置在本类中)
6. 开闭原则
定义
一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。
阐述
开闭原则告诉我们应尽量通过扩展软件实体的行为来实现变化,而不是通过修改已有的代码来完成变化,它是为软件实体的未来事件而制定的对现行开发设计进行约束的一个原则。
重要性
开闭原则是最基础的一个原则。有以下好处:
- 方便测试
- 提高复用性
- 提高可维护性
- 符合面向对象开发技术
实现方法
- 抽象约束
- 通过接口或抽象类约束扩展,对扩展进行边界限定,不允许出现在接口或抽象类中不存在的public方法
- 参数类型、引用对象尽量使用接口或者抽象类,而不是实现类
- 抽象层尽量保持稳定,一旦确定即不允许修改
- 尽量用配置参数控制程序的行为(如spring和strust的配置文件)
总结
六个原则如下:
- Single Responsibility Principle:单一职责原则
- Open Closed Principle:开闭原则
- Liskov Substitution Principle:里氏替换原则
- Law of Demeter:迪米特法则
- Interface Segregation Principle:接口隔离原则
- Dependence Inversion Principle:依赖倒置原则
把这6个原则的首字母(里氏替换原则和迪米特法则的首字母重复,只取一个)联合起来就是SOLID(solid,稳定的),其代表的含义也就是把这6个原则结合使用的好处:建立稳定、灵活、健壮的设计,而开闭原则又是重中之重,是最基础的原则,是其他5大原则的精神领袖。
遵循这6大设计原则基本上可以应对大多数变化,适当时候可以进行扩充,但是也并不局限于这6大设计原则。