C++ 设计模式(二)单例模式、策略模式、责任链模式和装饰器模式
2021/7/26 17:05:51
本文主要是介绍C++ 设计模式(二)单例模式、策略模式、责任链模式和装饰器模式,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
设计模式
- 单例模式
- 懒汉模式
- 定义
- 代码
- 策略模式
- 定义
- 背景
- 要点
- 本质
- 结构图
- 责任链模式
- 定义
- 背景
- 要点
- 本质
- 结构图
- 装饰器模式
- 定义
- 背景
- 要点
- 本质
- 结构图
- 责任链和装饰器的区别:
单例模式
懒汉模式
定义
懒汉模式只有在调用是才会生成单例类,没有调用的时候是不会生成的,可以理解为它很懒,所以叫懒汉模式。
代码
template<typename T> class Singleton { public: static T& GetInstance() { static T instance; // 这⾥要初始化DesignPattern,需要调⽤ DesignPattern 构造函数,同时会调⽤⽗类的构造函数。 return instance; } protected: virtual ~Singleton() {} Singleton() {} // protected修饰构造函数,才能让别⼈继承 Singleton(const Singleton&) {} Singleton& operator =(const Singleton&) {} }; // 可以用子类继承Singleton来扩展单例类 class DesignPattern : public Singleton<DesignPattern> { friend class Singleton<DesignPattern>; // friend 能让 Singleton<T> 访问到 DesignPattern构造函数 private: DesignPattern(){} DesignPattern(const DesignPattern&) {} DesignPattern& operator=(const DesignPattern&) {} }
策略模式
定义
定义⼀系列算法,把它们⼀个个封装起来,并且使它们可互相替换。该模式使得算法可独⽴于使⽤它的客户程序⽽变化。
背景
某商场节假⽇有固定促销活动,为了加⼤促销⼒度,现提升国庆节促销活动规格;
要点
1、策略模式提供了⼀系列可重⽤的算法,从⽽可以使得类型在运⾏时⽅便地根据需要在各个算法
之间进⾏切换;
2、策略模式消除了条件判断语句;就是在解耦合;
3、充分体现了开闭原则;单⼀职责;
本质
分离算法,选择实现;
结构图
责任链模式
定义
使多个对象都有机会处理请求,从⽽避免请求的发送者和接收者之间的耦合关系。将这些对象连成⼀条链,并沿着这条链传递请求,直到有⼀个对象处理它为⽌。
背景
请假流程,1天内需要主程序批准,3天内需要项⽬经理批准,3天以上需要⽼板批准;
要点
解耦请求⽅和处理⽅,请求⽅不知道请求是如何被处理,处理⽅的组成是由相互独⽴的⼦处理构成,⼦处理流程通过链表的⽅式连接,⼦处理请求可以按任意顺序组合;
责任链请求强调请求最终由⼀个⼦处理流程处理;通过了各个⼦处理条件判断;
责任链扩展就是功能链,功能链强调的是,⼀个请求依次经由功能链中的⼦处理流程处理;
充分体现了单⼀职责原则;将职责以及职责顺序运⾏进⾏抽象,那么职责变化可以任意扩展,同时职责顺序也可以任意扩展;
本质
分离职责,动态组合;
结构图
装饰器模式
定义
动态地给⼀个对象增加⼀些额外的职责。就增加功能⽽⾔,装饰器模式⽐⽣成⼦类更为灵活。
背景
普通员⼯有销售奖⾦,累计奖⾦,部⻔经理除此之外还有团队奖⾦;后⾯可能会添加环⽐增⻓奖⾦,同时可能针对不同的职位产⽣不同的奖⾦组合;
要点
通过采⽤组合⽽⾮继承的⼿法, 装饰器模式实现了在运⾏时动态扩展对象功能的能⼒,⽽且可以根据需要扩展多个功能。 避免了使⽤继承带来的“灵活性差”和“多⼦类衍⽣问题”。
不是解决“多⼦类衍⽣的多继承”问题,⽽是解决“⽗类在多个⽅向上的扩展功能”问题;
装饰器模式把⼀系列复杂的功能分散到每个装饰器当中,⼀般⼀个装饰器只实现⼀个功能,实现复⽤装饰器的功能;
本质
动态组合
结构图
责任链和装饰器的区别:
责任链是选择,装饰器是叠加。
这篇关于C++ 设计模式(二)单例模式、策略模式、责任链模式和装饰器模式的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-20获取apk的md5值有哪些方法?-icode9专业技术文章分享
- 2024-11-20xml报文没有传 IdentCode ,为什么正常解析没报错呢?-icode9专业技术文章分享
- 2024-11-20如何知道代码有没有进行 Schema 验证?-icode9专业技术文章分享
- 2024-11-20Mycat教程:新手快速入门指南
- 2024-11-20WebSocket入门:轻松掌握WebSocket基础
- 2024-11-19WebSocket入门指南:轻松搭建实时通信应用
- 2024-11-19Nacos安装资料详解:新手入门教程
- 2024-11-19Nacos安装资料:新手入门教程
- 2024-11-19升级 Gerrit 时有哪些注意事项?-icode9专业技术文章分享
- 2024-11-19pnpm是什么?-icode9专业技术文章分享