变化与稳定的分割,管理变化,提高复用。
构造函数调用虚函数是静态绑定
八大原则:
依赖倒置,
开放封闭,
单一职责,
liskov替换、
接口隔离、
对象组合优于继承、
封装变化点
面向接口编程:设计为抽象基类
静态-》动态
早绑定-》晚绑定
继承-》组合
编译时依赖-》运行时依赖
紧耦合-》松耦合
class A{
B* pb;
//指针指向一个类,灵活运用子类。
}
组件协作
1、模板方法
产生一个模板,提取出变化的部分供修改(有固定的部分(可转换为模板),变化的部分提前出来)
2、策略模式
开始使用多态来进行编写,将if...else改写为多种方法的子类。(基本的设计模式,将if...else变化转换为子类)
3、观察者模式
多观察者模式:使用vector存储基类指针(可以添加删除观察者),指向多种子类观察者。(定义对象一对多的依赖关系,一个对象变化会通知与其相关的其他对象。)
单一职责
4、装饰模式
多对多对象互相调用,可以使用动态组合给对象赋予新的职责,(组合优于继承)(多个子类需要相同新的职责函数,新建指责类指针调用基类)
5、桥模式
将抽象部分(业务部分)与实现部分(平台实现)分离,使其可独立变化。(一个基类下的子类有两种变化维度,将其剥离开)
对象创建:
6、工厂方法
通过继承构造基类来对多个相似的具体类进行构造,从而可以动态绑定所使用的类。绕开new具体类,避免依赖具体实现细节,将类的选择放到未来外界传入所在函数再new对象(将基类与具体类分开写在不同文件夹)。多态new
7、抽象工厂(由上面增加)
不同:一系列互相依赖的对象创建(将有关系的类合并在一个创建类中创建,低耦合高聚合)
8、原型模式
将工厂基类并在一起,利用拷贝构造函数,在类中添加clone的虚函数,方便对具体类进行克隆。设计一个原型对象等待clone函数调用,获得一个新对象。(其实就是将创建类与基本属性类合并到一个类中,较少)
9、构建器
以模板方法来创建类
构建与创建分离。(需要看一下其他老师的)
对象性能:解决抽象得时候会影响太多性能得问题
10、单件模式
保证只有一个实例并提供一个该实例得全局访问点。
私有化构造函数与复制构造函数,静态成员函数返回一个静态成员变量。
静态变量:存实例(初始化为nulllptr)
在为实例为nulptr的话就构造,否就返回之前的变量
多线程会出问题:
1、加锁 代价过高(高并发时)
Lock
2、双检查锁(会产生reorder问题,底层指令问题,使用volatile)
if(x)
{
Lock lock;
if(x){
command;
}
}
11、享元模式:大量的细粒度的对象导致运行代价太大采取这样的模式/flywieght
运用共享技术。存在的对象不新建,不存在的对象就新建并加入对象池(使用map来维持),降低对象个数。
接口隔离:接口直接依赖出现问题,通过间接接口解决
12、门面模式facade/
采用一个中间接口隔离
13、代理模式 proxy(没理解)
也是增加一层间接层。由于直接使用对象开销大,安全控制,进程外访问。
为其他对象提供一种代理以控制(隔离:使用接口)控制这个对象的访问(间接使用)。一般通过工具自动生成。
14、适配器
旧对象与新环境的适应。使用适配接口来进行适配新旧接口。继承新街口组合旧接口
15、中介者
多个对象互相关联交互,产生一个多对一,一对多的中介对象。
状态变化
16、state模式:对象状态改变-》行为随之变化(开闭原则)。
将状态变化抽象成基类,子类继承各自重写。注意是否是单一模式
17、备忘录:某些对象在转换后可回溯
在设计一个对象,用来保留快照(可以是其他存储格式),在不破坏封装性的条件下。(序列化方式)
数据结构:将数据结构封装在内部,仅暴露一个接口
18、组合模式
将对象组合做成树形结构,利用树的多态遍历(多态递归调用)将一对多的关系转为一对一关系而不需要关注是什么对象。
19、迭代器:集合内部结构变化,在不暴露内部结构时,可以顺序访问集合
1、利用新类做(落后了,虚函数消耗大)运行时多态
2、泛型编程和stl(98年)编译时多态
20、职责链:一个请求多个对象处理,但在运行时只有一个接收者。
沿链表传递请求,直到请求被处理。
需要缺省机制,为了防止请求到最后无对象处理
行为变化模式:行为和组件解耦?
21、命令模式:行为请求者与实现这紧耦合,接口规范严格,性能损失(与函数对象(更优先)有点类似,只需要参数返回值一致,与模板结合就是编译时多态,与虚函数使运行时多态)
将请求封装成对象,可对其进行排队、记录、合并、撤回等操作。
22、访问器:需求改变-》类层次结构需添加行为(基类修改的时候需要修改子类)。开闭原则
预先设计一个虚函数传入对象(对象里面包含其他的类的函数拓展)可以通过对象调用进行拓展。二次多态辨析。
限制:子类数量固定(子类必须稳定)
领域问题
23、解析器:变化抽象为规则。
语法树构建,栈。条件:多边化,容易转换为解析规则,简单规则。