设计模式
目的
- 复用:编译后的二进制复用,非代码的复用;
- 了解设计模式的框架,知道什么场景使用什么设计模式。
重构技巧
- 重构获得模式,寻找变化点,隔离稳定与变化;
- 静态绑定->动态绑定
- 早绑定->晚绑定
- 继承->组合
- 合成聚合:尽量使用合成、聚合,尽量不要使用类继承。
- 继承属于强耦合,父类更改,子类必须要变。
- 编译时依赖->运行时依赖
- 紧耦合->松耦合
- 无环依赖
- 避免贫血类:只有数据没有功能的类。
- 避免上帝类
- 只说不问:可以由类独立完成的操作,不需要开放过多的接口。
- 避免使用静态成员
- 让类尽可能小
面向对象编程的特征
- 变量声明为抽象基类;
- 晚绑定:运行时绑定;
- 依赖接口編程,避免依赖实现;
- 组合优于继承;
- 拓展性:可通过子类重写父类虚函数;
- 抽象、封装、多态;
- 隔离变化与稳定;
- 界面与业务分隔;
编码的原则
- 保持简单和直接原则(KISS)
- 不需要原则(YAGNI)
- 避免复制原则(DRY)
- 信息隐藏原则
- 高内聚原则
- 松耦合原则
- 小心优化原则
- 最少惊讶原则
- 童子军原则
- 迪米特法则(不要和陌生人说话)
- 控制依赖方向
如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用,如果其中一个类需要调用另外一个类的某个方法的话,可以通过第三者转发调用。
降低对象间的耦合,提高系统的可维护性,在模块间应该只通过接口编程,而不会理会模块的内部工作原理,它可以使各个模块耦合度讲到最低,促进软件的复用。
设计模式
组件协作
1、模板模式:
驱动器状态机存在稳定的整体结构、子步骤存在多变的需求.父类实现框架、调用虚函数,推荐声明为protected注:父类的西沟为虚函数
2、策略模式:
速度模式位置模式切换使用的算法经常变化,可能新增传统做法:switch case,违背开闭原则。拓展方式解决:提取基类算法纯虚,派生具体子类算法.使用基类指针,可以结合工厂模式,创建返回具体的子类算法,可互相替换.消除条件判断解耦.绝对稳定不变的可以用枚举坏味道
3、观察者模式(事件模式)
目标对象变化,观察者对象自动得到通知并响应;
观察者依赖抽象,抽象通知;
逻辑不要耦合业务界面,松耦合;
vector或者list支持多个观察者;
可增删单一职责类装饰模式组合(has a)优于继承(is a)继承+组合:完善接口规范,支持shi?x解决主体类在多个方向上的拓展多继承:继承多个接口.抽象基类:具体转抽象静态转动态、继?转组合框架与应用、晚绑定:lib调用app(面向对象),延迟到子类(父类定义虚函数,子类重写)实现松耦合早绑定:app调用lib职责链避免发送者和接收者之间的耦合.行为变化类命令模式与函数对象类似.行为封装为对象.请求与实现解耦.