声明:本栏目的 [A] 系列的学习笔记,学习对象为 B 站授课视频 C++设计模式(李建忠),参考教材为《设计模式:可复用面向对象软件的基础》。本栏目 [A] 系列文章中的图件和笔记,部份来自上述资源。
一个目标
- 管理变化,提高复用
两种手段
- 分解
- 抽象
八大原则
重构技法
从封装变化角度对模式分类
- 李建忠教学,将 gof 23种设计模式 分类。
C++ 对象模型
- A 继承 B,在内存模型中如图,B的所有的成员放在A的前面,如果B的实例作为A的成员,其内存模型也是一样。所以,类组合应该将B的指针作为A 的成员,如图中的 pb , pb不但可以指向B,也可以指向B的子类。 所有的设计模式都殊途同归,通过用指针指向一个多态对象来展现出灵活性,这是松耦合结构的对象模型基础。
关注变化点和稳定点
- 对于全都变化和全都稳定的软件,设计模式毫无意义。
- 每个设计模式都有其缺点,这个缺点其实就是其针对的稳定点,如果稳定点发生变化,那么原本用的设计模式就不再适用,这时往往可以更换使用其他的设计模式。
什么时候不用模式
- 代码可读性很差时。此时需要先提高可读性,然后再考虑设计模式。
- 需求理解还很浅时。应该先考虑好需求,可以先不用任何设计模式,先做好第一版第二版,后续更新迭代时再使用设计模式。
- 变化没有显现时。此时无法把握稳定点和变化点,容易做无用功。
- 不是系统的关键依赖点。优先考虑在系统的关键模块使用设计模式。
- 项目没有复用价值时。比如有些外包项目,做完交付后再也不管了可以不用设计模式。
- 项目将要发布时。首先要保证软件的逻辑正确性,保证产品的可用性。
经验之谈
- 不要为模式而模式
- 关注抽象类 和 接口
- 理清变化点和稳定点
- 审视依赖关系
- 要有 Framework 和 Application 的区隔思维
- 良好的设计是演化的结果,不要追求一步到位。