设计模式,稳定中有变化的情况

变化与稳定的分割,管理变化,提高复用。

构造函数调用虚函数是静态绑定

 别人的笔记

八大原则:

依赖倒置,

开放封闭,

单一职责,

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、解析器:变化抽象为规则。

语法树构建,栈。条件:多边化,容易转换为解析规则,简单规则。

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值