有关设计模式,偶然间发现:https://refactoringguru.cn/design-patterns/cpp
创建型设计模式:
单例模式:
利用static特性,在栈上,堆上申请单例对象,注意线程安全以及资源释放。
简单工厂模式:
工厂方法:通过函数入参决定生产哪种产品(构造子类对象)。
简单工厂:工厂类由继承基类的方法,具体产品的实例化交给子类,
==》生产单一种类的产品
抽象工厂模式:
如果要生产搭配组合型产品,如电视型号+遥控型号的组合,可以创建超级工厂定义基类。
由具体的子类实例化实现不同的搭配,产品的构造。
建造者模式:
提供一种封装,管理各个子对象的创建。
如:房屋类建筑的构造,由门,走廊,等不同模块不同构造组装而成。
定义一个基本的产品类,由建造者管理这个类的一个对象,去构建不同的模块,最后实现组装返回。
原型模型:
提供一个接口,实现类对象的复制功能。 如试卷复印,需要副本,简化构造析构时使用。
这里在实现clone函数的时候,实际上是调用拷贝构造函数,需要注意类内成员的深拷贝和浅拷贝问题。
结构型设计模式:
代理模式:
对目标要访问的结构做封装,通过中间类对象访问的方式。
中介和保护的作用。
远程代理:为一个对象的地址空间提供局部代表。 ==》通过代理,实际是做远程通信
虚拟代理:根据需要来创建开销较大的对象。 ==》对开销大的对象做封装,真正使用时做整整委托调用
保护代理:用于对象应该具有不同访问权限的场景,控制对原始对象的访问。
智能指引:取代简单的指针,它在访问对象时执行一些附加操作。
-- 引自《设计模式:可复用面向对象软件的基础》
桥接模式:
一个目的是可以替换继承。 使用组合,代替了继承实现了抽象和具体的解耦。
抽象部分与实现部分分离,使它们都可以独立的变化。
如,有多种操作系统,也有多种可运行平台,可以分别实现各自的模块。
通过一个桥接类,可以对操作系统对象和平台对象做管理。(类似组合,可以扩展用到继承统一接口,实现多对多)
简单想:就是用一个中间类连接管理了另外两个类对象,实现了一对一关联。 可以用继承扩展多对多。
适配器模式:
如:已有的环境使用接口恒定,但是,员工实现的接口不匹配,需要增加一个适配器,把我们的接口适配成原调用接口。
例如:各种不同的设备要在220v电压下充电,需要一个适配器,将220v电压转换成我们需要的各种电压。
目标已经无法修改,我们需要对现有的适配者进行一定的处理,使其能和目标一致。
外观模式:
通过一个中间管理类,管理了一些列内部动作/(子系统的构造,业务模块的构造),简化使用流程。
享元模式共享工厂:
大量细粒度对象的构建,用一个对象管理,持续使用。
例如:五子棋游戏中黑白棋子的落子动作。
装饰器模式
不改变现有对象的前提下,通过继承的方式,给现有的类上新增新的功能。
组合模式:
部分整体模式:把一组相似的对象当作单个对象。
可以实现管理公司部门层级,人员管理的场景
行为型结构 设计模式
备忘录模式:
保存对象的某个状态,适当的时候进行恢复,最好使用友元类的方式进行使用。
场景:ctrl+z动作,游戏场景中复活动作,数据库事务
策略模式:
实现某种目的,有多种不同的方案,可以使用策略模式:
如算法实现方案,出行方式(飞机,汽车,火车),卖东西打折方案,
可以用一个基类指针做入口选择不同的策略,也可以用入参的方式实现。
迭代器模式:
提供一些接口,实现不同方案遍历集合内元素的方案。
访问者模式:
在被访问的类中,提供对应的接口,让访问者类实现不同的业务。
如:银行的柜台业务可以是被访问者,用户作为访问者。
普通员工的职能权限,和管理者的只能权限
观察者模式:
当对象之间存在一对多,多对多的关系时,使用观察者模式。
方案1:推模型,当消息有变更时,直接向内部保存的观察者们中主动发消息
方案2:拉模型,需要一个注册中心的管理,观察者们主动订阅某类型的消息。
当消息触发时,主动把消息主题发送给观察者们,主动根据主题拉取消息。
解释器模式:
类似于词法分析器的功能,提供对应的接口,对输入的数据进行特定逻辑的解析,如:数学运算。
命令模式:
请求以命令的形式,包裹在对象中,传给调用对象,调用对象内部,根据命令查找可以处理该命令的执行对象。
例如:实现对大量命令的处理管理,可以对模块进行划分,通过指令对应执行对象控制模块的执行。
模板模式:
基类定义具体的数据结构和对外接口,由子类进行具体的行为实现。
如:建造者模式中,门,走廊,房间的细节实现交给子类。
责任链模式:
请求者的处理需要多个对象依次处理,并且有一定的先后依赖关系,如某些算法的实现流程把控,可以用责任链。
对一个请求,需要多个不同对象依次处理,需要指定好下一个处理对象。
如:请假电子流需要各级领导的审批。
中介者模式:
用一个中间对象,实现一些列其他对象的消息交互。
如:租户与房东无法直接沟通,但是都可以与房屋中介沟通。
状态模式:
将基于switch语句的大型状态该机转换为对象。
1:关注各个状态对应的局部实现细节。
2:由调用者直接构造对象控制访问哪个状态。 (控制流程)
如:可以把一个大的流程划分几个不相干的子流程,通过状态标志,实现各子流程的同步调用。
==》如:工厂的流水线 ,对生产产品的流程控制。