最近想用C++把23种设计模式都实现一遍,也重新温故学习一下设计模式.

题外话:
还记得工作之初非常注重谈论设计模式, 在Java项目中常常以套用了哪些设计模式而得意.
后来在Java开发中又注意到不要为了设计模式而coding,要在无意识中写出来的代码自然而然就用上了设计模式. 简单的说:不要刻意套用设计模式,综合实际情况选取最合适的模式或变种.

扯远了,接下的这个系列,我将会基于C++来实现23种设计模式, 主要包含模式的一些说明描述和实际演示代码.
其中模式的简介和说明我会参考网上的资料, 演示代码和UML图将完全自己整理实现.
代码文档详见 github - designpattern4cplusplus

设计原则

设计模式要遵循基本的设计准则:

  • 可维护性 软件能够被理解、改正、适应及扩展的难易程度
  • 可复用性 软件能够被复用的难易程度

面向对象设计原则

单一职责原则

  • 一个对象应该只包含单一的职责,并且该职责被完整地封装在一个类中
  • 就一个类而言,应该仅有一个引起它变化的原因

设计软件系统中各模块时应注意高内聚低耦合

  • 高内聚: 职责相关性和集中度的度量
  • 低耦合: 各模块建相互关联的度量

单一职责原则用于控制类的力度即大小

开闭原则

软件实体应对扩展开放,对修改关闭.该原则关键在于抽象化, 可为系统定义一个相对稳定的抽象层,将不同的实现行为放到具体的实现层中完成.

里氏代换原则

所有引用基类的地方必须能透明地使用其子类的对象
设计时,尽量使用基类类型来定义对象,运行时再确定子类类型.侧重于运行层面;运行时,确定实现类型

依赖倒转原则

高层模块不应该依赖低层模块,它们都应该依赖抽象。抽象不应该依赖于细节,细节应该依赖于抽象。侧重于设计层面

  • 要求针对接口编程,不要针对实现编程
  • 用接口或抽象类来声明变量类型、参数类型声明、方法返回类型声明,以及数据类型转换等,而不要使用具体类来做这些事情

接口隔离原则

客户端不应该依赖那些它不需要的接口
接口不宜过大,应使每个接口仅承担一个相对独立的角色或功能,使用该接口的客户端仅需知道与之相关的方法即可。

合成复用原则

优先使用对象组合,而不是通过继承来达到复用的目的

  • 黑箱复用 - 对象组合
  • 白箱复用 - 继承

迪米特法则

也称最少知识原则,每一个软件单位对其他单位都只有最少的知识,而且局限于那些与本单位密切相关的软件单位

  • 在类的划分上应尽量创建松耦合的类,类之间的耦合度越低,越有利于复用
  • 类的结构设计上,每一个类都应该降低其成员变量和成员函数的访问权限