C++ 设计模式—简略版
创建型模式(6种)
单例模式
某个类只允许有一个实例化对象。
因此,构造函数、拷贝构造函数都需要是private
类型
提供访问这个唯一实例化对象的接口。
简单工厂模式
存在某个抽象类,它有许多派生类。
将创建对象的任务,交给工厂类。
简单工厂根据传递的参数,生成不同的派生类对象并返回。
工厂方法模式
存在某个抽象类,它有许多派生的具体类。
存在某个抽象工厂,它有许多派生的具体工厂类。
由具体工厂创建具体类对象。
主要应用的是C++的多态特性
抽象工厂模式
存在多个抽象类,它有许多派生的具体类。
存在某个抽象工厂,它有许多派生的具体工厂类。
具体工厂创建一系列的派生类,这一系列的派生类,被称为一个产品族。
原型模式
根据已有对象,复制新的对象。
从这方面将,与构造函数有异曲同工之处。
但原型模式是一种设计模式,它可以提供更高层次的抽象接口。
而拷贝构造函数,则只能在知道具体类的时候,才方便使用,比较偏底层。
建造者模式
对于一个复杂的类,它有多个部分(成员变量)组成。
分别创建每个组成部分(成员变量),然后组成一个整体对象。
结构型模式/组合型模式(7种)
适配器模式
在旧的接口不符合新的接口的需求时,如何用旧的接口实现新的接口的需求。
声明一个新的适配器类,适配器通常继承于新的接口。
在适配器类的成员变量中,有一个旧的接口类的对象;
在适配器类的成员函数中,有一个新的接口类的调用方法;
在新的方法中,使用旧的对象调用旧的方法。
至此,完成适配。
桥接模式
假设有一个抽象类,它有多个派生类;
然后有另一个抽象类,它也有多个派生类;
两者的派生类之间存在调用关系。
我们可以通过在两个抽象类之间架起一座桥,也就是使用抽象类调用抽象类
从而避免派生类调用派生类引起的组合爆炸。
所以,桥接模式,可以简单理解为动态多态
+组合策略
动态多态的关注点在于纵向拓展;而组合策略的关注点,在于横向扩展。
组合模式
实例:文件系统
文件系统分为文件夹和文件,文件可以有多种类型
文件夹(组合容器
)和文件(叶子节点
)继承与同一基类(组合接口
)
所以文件夹和文件可以不作区分,被同意对待;
文件夹与其内部的成员,形成树状结构。
装饰模式
组件接口(Text)
:定义核心功能(如render())。
具体组件(PlainText)
:实现基础功能。
装饰器基类(TextDecorator):继承Text,保证装饰器也能被继续装饰。持有Text对象
(通过组合而非继承扩展功能)。
具体装饰器(BoldDecorator等):在调用核心方法前后添加新行为。
外观模式
当有多个复杂的子系统时,提供一个统一的接口,对外提供服务。
享元模式
通过共享对象,减少代码中对象的个数,继而减少内存的使用,提高程序性能。
可共享的部分,存储在享元类中;
不可共享的部分,在调用时可以作为参数传递。
存在一个共享池,当需要的对象不存在时,由共享池创建;当存在时,由共享池返回。
共享池类似于单例模式。
代理模式
通过一个代理对象,访问目标对象。
代理可以在调用真实对象前后添加额外逻辑(如权限检查、缓存、延迟加载等)。
代理模式:“增强或控制”某个对象的功能,代理和真实对象是平级的(实现相同接口)。就像经纪人包装明星,但对外表现和明星一致。
VS
门面模式:“整合并简化”一群对象的调用,门面是子系统的上层抽象。就像服务员隐藏后厨的复杂性,提供一个更友好的接口。
行为型设计模式(11种)
职责链模式
将多个对象连成一条链:
如果当前对象能处理,那就当前对象处理
如果当前对象不能处理,那就转给下一个对象处理。
命令模式
将请求封装成一个独立的对象(命令),允许你参数化客户端(发送者)与服务端(接收者),从而支持请求的排队、记录、撤销或重做等操作。
命令模式把请求变成“可携带、可存储、可撤销”的对象,像快递包裹一样灵活传递和处理!
解释器模式
它定义一种语言的语法规则,并提供一个解释器来解释这种语言中的表达式。
迭代器模式
支持以不同的方式遍历一个聚合对象,在同一个聚合对象上可以定义多种遍历方式。
中介者模式
通过引入一个中介对象来封装一组对象之间的交互,从而减少对象间的直接耦合,使系统更易于维护和扩展。
备忘录模式
在不破坏对象封装性的前提下,捕获并外部化对象的内部状态,以便后续可以随时将对象恢复到之前的状态。
观察者模式
当一个对象改变时,所有依赖它的对象都要改变。
因此在被观测者内部需要存储所有的观测者。
状态模式
当内部状态改变时,改变它的行为。
策略模式
定义一系列的算法类,将每一个算法封装起来,并让它们可以相互替换。
模板方法模式
定义一个操作中算法的框架,而将一些步骤延迟到子类中。
访问者模式
将算法与对象结构分离,使得在不修改现有对象结构的前提下,能够为对象结构中的元素添加新的操作。
简单来说,它像是一个“巡回检查组”,你可以派不同的“访问者”到一组对象中执行特定任务,而无需让这些对象本身处理这些任务。