设计模式学习笔记
-
依赖倒置原则DIP
1.1 依赖倒置原则,英文缩写
DIP
,全称Dependence Inversion Principle
.1.2 原始定义:
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.
1.3 官方翻译:
高层模块不应该依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象.
1.4 实践:
把存在多种实现的功能提取成接口,新增模块只需要新增一个接口实现即可.一个违反
依赖倒置原则DIP
的设计:多个实现揉和在一个方法中,使用参数进行逻辑判断使用哪种实现. -
单一职责原则SRP
2.1 单一职责原则,英文缩写
SRP
,全称Single Responsibility Principle
.2.2 原始定义:
There should never be more than one reason for a class to change.
2.3 官方翻译:
应该有且仅有一个原因引起类的变更.简单点说,一个类,最好
只负责一件事
,只有一个
引起它变化的原因.2.4 实践:
有点
E-R图
分解的赶脚,按照功能进行分解成多个类,每个类负责的事情在需求上会属于同一范畴,某一范畴的变动不应该对其他类进行变动. -
接口隔离原则ISP
3.1 接口隔离原则,英文缩写ISP,全称Interface Segregation Principle.
3.2 原始定义:
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.
3.3 官方翻译:
其一是不应该强行要求客户端依赖于它们不用的接口;其二是类之间的依赖应该建立在最小的接口上面.
简单点说,客户端需要什么功能,就提供什么接口,对于客户端不需要的接口不应该强行要求其依赖;
类之间的依赖应该建立在最小的接口上面,这里最小的粒度取决于单一职责原则的划分.
3.4 实践:
接口
尽量细化,同时``接口中的方法尽量少,提供给每个模块的都应该是单一接口
,提供给几个模块
就应该有几个接口
,而不是建立一个庞大的臃肿的接口
,容纳所有的客户端
访问.接口
是我们设计时对外提供的契约,通过分散定义多个接口
,可以预防未来变更的扩散,提高系统的灵活性和可维护性. -
开闭原则OCP
4.1 开闭原则,英文缩写OCP,全称Open Closed Principle.
4.2 原始定义:
Software entities (classes, modules, functions) should be open for extension but closed for modification.
4.3 字面翻译:
软件实体(包括类、模块、功能等)应该对
扩展
开放,但是对修改
关闭.4.3 实践:
在软件的迭代过程中,通过扩展可以解决的问题尽量不进行修改
源代码
以减少风险的发生.所以设计之处要考虑实现
的抽象
,给扩展预留
口子. -
里氏替换原则LSP
5.1 原始定义:
If for each object o1 of type S there is an object o2 of type T such that for all programs P defined in terms of T, the behavior of P is unchanged where o1 is substituted for o2 then S is a subtype of T。 (Functions that use pointers or references to base classes must be able to use object of derived classes without knowing it)
5.2 翻译:
如果对每一个类型为
T1
的对象o1
,都有类型为T2
的对象o2
,使得以T1
定义的所有程序P
在所有的对象o1
都替换成o2
时, 程序P
的行为没有变化,那么类型T2
是类型T1
的子类型.换言之,一个软件实体如果使用的是一个
基类
的话,那么一定适用于其子类
,而且它根本不能察觉出基类
对象和子类
对象的区别.子类
可以扩展父类
的功能,但不能改变父类
原有的功能5.3 规则:
1. 子类必须完全实现父类的方法 2. 子类可以有自己的个性 3. 覆盖或实现父类的方法时输入参数可以被放大
5.4 实践:
在设计上,子类的变更不能改变原有的功能,即要保证
派生类(子类)
对象能够替换其基类(超类)
对象被使用.
面向对象编程OOP
通过基本的了解会发现各个原则之间是有类似的地方的.不过设计原则没有绝对的界限,它们只是从不同的侧重点去约束我们的软件架构,使其能使用各种不同的需求.