设计模式
why: 为了在编译单元层面复用代码,隔离变化部分。
what: 设计模式是解决某类问题的模板。
principle:
-
依赖倒置(DIP):
1.1. 高层(稳定)、底层(变化)都依赖于抽象(稳定)
1.2. 实现细节依赖于抽象
-
开闭原则(OCP):
2.1. 对扩展开放、对修改封闭,这样不用重新编译测试部署
2.2. 变化发生后就通过抽象来隔离同类变化
-
单一职责(SRP):
3.1 变化方向隐含着类的责任(识别变化点,确保这个方向的变化不可能发生)
3.2 一个类只有一个引起变化的原因
-
接口隔离原则(ISP)
5.1 不要强迫客户程序依赖他们不用的接口,接口要小而完备
5.2 尽量把接口private、protected
-
里式替换准则(LSP)
5.1 子类可以替换父类(IS-A)
5.2 父类包含了子类的实现细节,会导致无法替换
-
迪米特法则(LOD)
6.1 只和朋友通信
6.2 朋友就是类成员、接口参数,不允许直接在方法体中使用其他对象
-
封装
7.1 封装方法和数据
7.2 封装变化点
-
优先使用对象组合、而不是类继承
how:
- 使用重构持续改善设计。
- 识别变化和稳定点,问自己变化点是什么,然后通过组合抽象基类的指针去隔离变化。
- 关注依赖关系,不要依赖不稳定部分,关注接口是否不变
- 继承转组合、早绑定转晚绑定
- 通过提取公共部分(抽象基类)、组合抽象基类来消除重复;通过对条件语句抽象来消除if-else
when:
- 对需求了解很浅(无法分辨有没有复用性)的时候不用
- 代码可读性很差的时候不用
- 需要高性能的时候评估使用
其他:
- 属性和操作常常分离,接口依赖属性,操作依赖接口。(需要一个实例)