设计模式原则备忘
单一职责原则
There should never be more than one reason for a class to change.
单一职责原则(Single Responsibility Principle, SRP):应该有且仅有一个原因引起类的变更;
在Java中奉行面向接口编程,接口一定要做到单一职责,类的设计尽量做到单一职责;
开放-封闭原则
Software entities like classes, modules and functions should be open for extension but closed for modifications.
开放-封闭原则:一个软件实体如类、模块和函数应该对扩展是开放的,对修改是封闭的;
无论模块多么封闭,总会出现无法封闭的需求变化,面对需求,对程序的修改尽可能通过增加新代码实现(开放),而不是更改原有代码(封闭);
应用
- 对接口or抽象类进行拓展时,在接口or抽象类中不存在的public方法不允许出现;
- 引用对象变量尽量使用接口/抽象类,避免使用实现类;
依赖倒置原则
High level modules should not depend upon low level modules, Both should depend upon abstractions, Abstractions should not depend upon details. Details should depend upon abstractions.
依赖顺置:接口(抽象)依赖于实现类(细节)
依赖倒置原则:抽象不应该依赖实现细节(接口不依赖于实现类),实现细节依赖抽象(依赖倒置)
一言蔽之,依赖倒置原则就是面向接口(抽象)编程,避免对实现编程,可以降低类之间的耦合性,降低系统的稳定性,降低代码的可读性和可维护性;
里氏替换原则(针对继承)
继承固有缺陷
- 继承是侵入式的,破坏了父类的封装性;
- 增强了类之间的耦合。由于子类继承父类,父类代码变更时需要考虑子类的修改,导致代码大规模重构;
里氏替换原则
LSP原则不保证可以用父类替代子类使用
针对继承固有缺陷,里氏替换原则(Liskov Substitution Principle, LSP)提出所有引用父类的地方必须能透明地使用子类对象(用子类替换父类不会出现任何错误异常);
里氏替换原则要求:
1. 子类必须完全实现父类方法;
2. 在类中调用其他类时,引用参数务必选择父类或者接口;
接口隔离原则
接口隔离原则要求接口功能尽量细化:客户端需要什么接口就提供什么接口,去除不需要的接口;
与单一职责区别:
+ 单一职责要求类和接口责任单一;
+ 接口隔离原则要求接口中的方法尽量少;
迪米特原则
迪米特原则(Law of Demeter, LoD)又称最少知识原则(Least Knowledge Principle, LKP);
迪米特原则要求一个类与自己耦合的类知道最少(only talk to your immediate friends),因此迪米特原则要求设计类时尽量降低成员的访问权限;
迪米特原则核心思想:要求类间解耦,弱耦合;但是弱耦合会带来大量的中转类,提高复杂性;
参考
- 《设计模式之禅》
- 《大话设计模式》