设计模式

目的

  1. 复用:编译后的二进制复用,非代码的复用;
  2. 了解设计模式的框架,知道什么场景使用什么设计模式。

重构技巧

  1. 重构获得模式,寻找变化点,隔离稳定与变化;
  2. 静态绑定->动态绑定
  3. 早绑定->晚绑定
  4. 继承->组合
    1. 合成聚合:尽量使用合成、聚合,尽量不要使用类继承。
    2. 继承属于强耦合,父类更改,子类必须要变。
  5. 编译时依赖->运行时依赖
  6. 紧耦合->松耦合
  7. 无环依赖
  8. 避免贫血类:只有数据没有功能的类。
  9. 避免上帝类
  10. 只说不问:可以由类独立完成的操作,不需要开放过多的接口。
  11. 避免使用静态成员
  12. 让类尽可能小

面向对象编程的特征

  1. 变量声明为抽象基类;
  2. 晚绑定:运行时绑定;
  3. 依赖接口編程,避免依赖实现;
  4. 组合优于继承;
  5. 拓展性:可通过子类重写父类虚函数;
  6. 抽象、封装、多态;
  7. 隔离变化与稳定;
  8. 界面与业务分隔;

编码的原则

  1. 保持简单和直接原则(KISS)
  2. 不需要原则(YAGNI)
  3. 避免复制原则(DRY)
  4. 信息隐藏原则
  5. 高内聚原则
  6. 松耦合原则
  7. 小心优化原则
  8. 最少惊讶原则
  9. 童子军原则
  10. 迪米特法则(不要和陌生人说话)
  11. 控制依赖方向

如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用,如果其中一个类需要调用另外一个类的某个方法的话,可以通过第三者转发调用。

降低对象间的耦合,提高系统的可维护性,在模块间应该只通过接口编程,而不会理会模块的内部工作原理,它可以使各个模块耦合度讲到最低,促进软件的复用。

设计模式

组件协作

1、模板模式:

驱动器状态机存在稳定的整体结构、子步骤存在多变的需求.父类实现框架、调用虚函数,推荐声明为protected注:父类的西沟为虚函数

2、策略模式:

速度模式位置模式切换使用的算法经常变化,可能新增传统做法:switch case,违背开闭原则。拓展方式解决:提取基类算法纯虚,派生具体子类算法.使用基类指针,可以结合工厂模式,创建返回具体的子类算法,可互相替换.消除条件判断解耦.绝对稳定不变的可以用枚举坏味道

3、观察者模式(事件模式)

目标对象变化,观察者对象自动得到通知并响应;

观察者依赖抽象,抽象通知;

逻辑不要耦合业务界面,松耦合;

vector或者list支持多个观察者;

可增删单一职责类装饰模式组合(has a)优于继承(is a)继承+组合:完善接口规范,支持shi?x解决主体类在多个方向上的拓展多继承:继承多个接口.抽象基类:具体转抽象静态转动态、继?转组合框架与应用、晚绑定:lib调用app(面向对象),延迟到子类(父类定义虚函数,子类重写)实现松耦合早绑定:app调用lib职责链避免发送者和接收者之间的耦合.行为变化类命令模式与函数对象类似.行为封装为对象.请求与实现解耦.