面向对象的设计原则
概述
这篇文章讲解了面向对象的设计原则。
设计原则
单一职责原则
There should never be more than one reason for a class to change.
单一职责原则,Single Responsibility Principle,简称 SRP。单一职责原则要求一个接口或类只有一个原因引起变化,也就是一个接口或类只有一个职责,就只负责一件事情。
好处
- 类的复杂性降低,实现的职责都有清晰明确的定义
- 可读性提高
- 可维护性提高
- 变更引起的风险降低,变更是必不可少的,如果接口的单一职责做的好,一个接口修改只相应的实现类有影响,对其他接口无影响,对系统扩展性和维护性都有很大帮助。
单一职责原则最难划分的就是职责,一个职责一个接口,但现实问题是 “职责” 没有一个量化的标准,往往因项目而异,因环境而异,还要根据项目大小和复杂度来决定划分职责的粗细。
里氏替换原则
只要父类能出现的地方,子类就可以出现,而且替换为子类也不会产生任何错误或异常,使用者可能根本就不需要知道是父类还是子类。但反过来就不行了,子类出现的地方,父类未必就能适应。
里氏替换原则为良好的继承定义了一个规范,包含 4层含义:
- 子类必须完全实现父类的方法
- 子类可以有自己的个性
- 覆盖或实现父类的方法时输入参数可以被放大
- 覆写或实现父类的方法时输出结果可以被缩小
里氏替换原则的目的是增强程序的健壮性,版本升级时也可以保持很好的兼容性。增加子类对于原有子类没有影响。子类对应不同的业务含义,使用父类作为参数,传递不同子类完成不同业务逻辑。
依赖倒置原则
依赖倒置原则(Dependence Inversion Principle,DIP)定义为:
High level modules should not depend upon low level modules. Both should depend upon abstractions. Abstrations should not depend upon details. Details should depend upon abstractions.
三层含义:
- 高层模块不应该依赖低层模块,两者都应该依赖其抽象。
- 抽象不应依赖细节。
- 细节应该依赖抽象。
对于 java 来说,抽象指的是接口和抽象类,细节是指实现类。
依赖倒置原则可以减少类间的耦合性,提高系统的稳定性,降低并行开发引起的风险,提高代码的可读性和可维护性。
接口隔离原则
Clients should not be forced to depend upon interfaces that they don’t use.(客户端不应该依赖它不需要的接口)
The dependency of one class to another one should depend on the smallest possible interface.(类间的依赖关系应该建立在最小的接口上。)
通俗来讲:要建立单一接口,接口尽量细化,同时接口中的方法尽量少。
迪米特法则
迪米特法则(Law of Demeter,LoD)又称最少知识原则(Least Knowledge Principle,LKP),含义是:一个对象应该对其它对象有最少的了解,即一个类应该对自己所需要耦合或调用的类知道的最少。
开闭原则
Software entities like classes, modules and functions should be open for extension but closed for modifications.
一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。
开闭原则含义是说一个软件的实体应该通过扩展来实现变化,而不是通过修改已有的代码来实现变化。
参考资料
- 秦小波.设计模式之禅