【C++】设计模式

设计模式的种类

设计模式一般可以分为三大类,每类又包含若干具体的设计模式:

1. 创建型模式(Creational Patterns)


创建型模式关注于对象的创建机制,试图将对象的创建、组合和表示分离。通过这种方式,系统可以独立于如何创建、组合和表示这些对象。

简单工厂(Simple Factory):不是严格意义上的设计模式,但经常与工厂方法模式一起讨论。它不使用继承或接口,而是使用一个函数或静态方法来创建对象。


工厂方法(Factory Method):定义了一个创建对象的接口,但由子类决定实例化哪一个类。工厂方法让类的实例化推迟到子类。


抽象工厂(Abstract Factory):提供了一种创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。


单例(Singleton):确保一个类只有一个实例,并提供一个全局访问点。


建造者(Builder):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。


原型(Prototype):用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象。


2. 结构型模式(Structural Patterns)


结构型模式处理类或对象的组合,描述了如何将对象或类组合成更大的结构,同时保持结构的灵活性和效率。

适配器(Adapter):将一个类的接口转换成客户希望的另一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。


桥接(Bridge):将一个事物的抽象部分与它的实现部分分离,使它们都可以独立地变化。


组合(Composite):将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。


装饰器(Decorator):动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活。


外观(Facade):为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。


享元(Flyweight):运用共享技术有效地支持大量细粒度的对象。


代理(Proxy):为其他对象提供一种代理以控制对这个对象的访问。

复用与优化:HopeView与HopeFarm内核实践-CSDN博客


3. 行为型模式(Behavioral Patterns)


行为型模式专注于对象之间的责任分配和通信,描述了类或对象用于在运行时完成任务的方式。

责任链(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。


命令(Command):将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。


解释器(Interpreter):给定一个语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。


迭代器(Iterator):提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示。


中介者(Mediator):用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。


备忘录(Memento):在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。


观察者(Observer):定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知并自动更新。


状态(State):允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。


策略(Strategy):定义一系列算法,把它们一个个封装起来,并且使它们可以互相替换。本模式使得算法的变化独立于使用它的客户。


模板方法(Template Method):定义一个操作中的算法骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下重定义算法的某些特定步骤。


访问者(Visitor):表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。


理解并正确应用这些模式可以帮助编写更清晰、灵活和可维护的代码。

在软件开发中,某些设计模式比其他模式更常用,这取决于具体的编程环境、项目需求以及团队的偏好。以下是一些最常见和广泛使用的设计模式:### 创建型模式1. **单例(Singleton)**- 确保一个类只有一个实例,并提供一个全局访问点。- **应用场景**:配置管理器、日志记录器等需要唯一实例的服务。2. **工厂方法(Factory Method)**- 定义了一个创建对象的接口,但由子类决定实例化哪一个类。- **应用场景**:当一个类不知道它所必须创建的对象的类的时候,或者希望将对象的创建委托给子类时。3. **抽象工厂(Abstract Factory)**- 提供了一种创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。- **应用场景**:跨平台UI组件库,不同主题的界面元素创建等。4. **建造者(Builder)**- 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。- **应用场景**:复杂的对象创建,如大型数据结构或配置文件生成等。5. **原型(Prototype)**- 用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象。- **应用场景**:当创建成本高或复杂时,通过克隆已有对象来快速创建新对象。### 结构型模式1. **适配器(Adapter)**- 使原本由于接口不兼容而不能一起工作的那些类可以一起工作。- **应用场景**:对接旧系统或第三方库,API包装等。2. **装饰器(Decorator)**- 动态地给一个对象添加一些额外的职责,相比生成子类更为灵活。- **应用场景**:GUI控件、流处理、权限验证等。3. **代理(Proxy)**- 为其他对象提供一种代理以控制对这个对象的访问。- **应用场景**:远程服务调用、缓存、延迟加载等。4. **外观(Facade)**- 为子系统中的一组接口提供一个一致的界面,简化了高层模块对子系统的使用。- **应用场景**:简化复杂库或框架的使用,提供统一的API。### 行为型模式1. **观察者(Observer)**- 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知并自动更新。- **应用场景**:事件驱动系统、订阅-发布模型等。2. **策略(Strategy)**- 定义一系列算法,把它们一个个封装起来,并且使它们可以互相替换。- **应用场景**:算法选择、规则引擎等。3. **模板方法(Template Method)**- 定义一个操作中的算法骨架,而将一些步骤延迟到子类中。- **应用场景**:框架开发,定义固定流程但允许定制具体实现。4. **命令(Command)**- 将请求封装成对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。- **应用场景**:插件式架构、宏命令、事务处理等。这些模式之所以被广泛使用,是因为它们解决了许多常见的软件设计问题,并提供了良好的代码组织和扩展性。然而,选择哪个模式取决于具体的上下文和需求。在实际应用中,开发者可能会根据项目的特定要求来选择最合适的设计模式,甚至组合使用多种模式。

常用模式

以下是几种最常用的设计模式,这些模式在实际开发中频繁出现

创建型模式


单例(Singleton)
为什么常用:确保一个类只有一个实例,并提供全局访问点。非常适合用于管理连接池、配置管理等需要唯一实例的场景。


工厂方法(Factory Method)
为什么常用:允许子类决定创建哪一个产品对象,增加了灵活性和扩展性。适用于需要根据条件创建不同类型的对象的情况。


建造者(Builder)
为什么常用:当需要创建复杂对象时,使用建造者模式可以将构造过程与表示分离,使得同样的构建过程可以创建不同的表示。常用于GUI组件、大型数据结构的构建等。

https://blog.csdn.net/bandaoyu/article/details/83511946


结构型模式


适配器(Adapter)
为什么常用:使原本由于接口不兼容而不能一起工作的那些类可以一起工作。非常适合处理遗留代码或第三方库的集成问题。


装饰器(Decorator)
为什么常用:动态地给一个对象添加一些额外的职责,相比生成子类更为灵活。非常适合于需要在运行时动态改变对象行为的场景,如权限控制、日志记录等。


外观(Facade)
为什么常用:为复杂的子系统提供一个简化的接口。非常适合简化对复杂库或框架的使用,降低学习曲线。


行为型模式


观察者(Observer)
为什么常用:定义了一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知并自动更新。非常适合事件驱动系统和订阅-发布模型。


策略(Strategy)
为什么常用:允许算法独立于使用它的客户端变化。非常适合需要在运行时选择不同算法或行为的场景。


命令(Command)
为什么常用:将请求封装成对象,从而可以参数化客户、队列或记录请求,并支持可撤销操作。非常适合插件式架构和宏命令的实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/495477.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Kafka可视化工具 Offset Explorer (以前叫Kafka Tool)

数据的存储是基于 主题(Topic) 和 分区(Partition) 的 Kafka是一个高可靠性的分布式消息系统,广泛应用于大规模数据处理和实时, 为了更方便地管理和监控Kafka集群,开发人员和运维人员经常需要使用可视化工具…

TLDR:终端命令的简洁百科全书

TLDR,全称 “Too Long, Don’t Read”,是一款特别实用的终端命令百科全书工具。通过 TLDR,您可以快速查找到常用命令的使用方法,避免繁琐冗长的官方文档,让日常工作更加高效。 为什么选择 TLDR? 简单易用&…

2024-12-25-sklearn学习(20)无监督学习-双聚类 料峭春风吹酒醒,微冷,山头斜照却相迎。

文章目录 sklearn学习(20) 无监督学习-双聚类1 Spectral Co-Clustering1.1 数学公式 2 Spectral Biclustering2.1 数学表示 3 Biclustering 评价 sklearn学习(20) 无监督学习-双聚类 文章参考网站: https://sklearn.apachecn.org/ 和 https://scikit-learn.org/sta…

数据结构(Java版)第六期:LinkedList与链表(一)

目录 一、链表 1.1. 链表的概念及结构 1.2. 链表的实现 专栏:数据结构(Java版) 个人主页:手握风云 一、链表 1.1. 链表的概念及结构 链表是⼀种物理存储结构上⾮连续存储结构,数据元素的逻辑顺序是通过链表中的引⽤链接次序实现的。与火车…

《Java核心技术I》Swing的网格包布局

复杂的布局管理 网格包布局 行列大小可改变,先建立表格,合并相邻单元格,组件指定在格内的对齐方式。 字体选择器组件: 另个指定字体和字体大小的组合框两个组合框标签两个选择粗体和斜体的复选框一个显示示例字符串的文本区 将容…

Python——day09

os模块 sys模块 time模块 logging模块

IIC驱动EEPROM

代码参考正点原子 i2c_dri:主要是三段式状态机的编写 module iic_dri#(parameter SLAVE_ADDR 7b1010000 , //EEPROM从机地址parameter CLK_FREQ 26d50_000_000, //模块输入的时钟频率parameter I2C_FREQ 18d250_000 //IIC_SCL的时钟频率)( …

《计算机组成及汇编语言原理》阅读笔记:p86-p115

《计算机组成及汇编语言原理》学习第 6 天,p86-p115 总结,总计 20 页。 一、技术总结 1.if statement 2.loop 在许多编程语言中,有类种循环:一种是在程序开头检测条件(test the condition),另一种是在程序末尾检测条件。 3.C…

(带源码)宠物主题商场系统 计算机项目 P10083

项目说明 本号所发布的项目均由我部署运行验证,可保证项目系统正常运行,以及提供完整源码。 如需要远程部署/定制/讲解系统,可以联系我。定制项目未经同意不会上传! 项目源码获取方式放在文章末尾处 注:项目仅供学…

目标检测——基于yolov8和pyqt的螺栓松动检测系统

目录 1.项目克隆和环境配置1.1 我这里使用的是v8.0.6版本1.2 项目代码结构介绍 2.数据集介绍2.1 数据集采集2.2采集结果介绍 3.模型训练4.pyqt界面设计4.1 界面内容介绍4.2 界面实现 5.操作中的逻辑实现5.1 图片检测5.2 文件夹检测5.3 视频检测和摄像头检测 6. 效果展示 1.项目…

宠物行业的出路:在爱与陪伴中寻找增长新机遇

在当下的消费市场中,如果说有什么领域能够逆势而上,宠物行业无疑是一个亮点。当人们越来越注重生活品质和精神寄托时,宠物成为了许多人的重要伴侣。它们不仅仅是家庭的一员,更是情感的寄托和生活的调剂。然而,随着行业…

原点安全再次入选信通院 2024 大数据“星河”案例

近日,中国信息通信研究院和中国通信标准化协会大数据技术标准推进委员会(CCSA TC601)共同组织开展的 2024 大数据“星河(Galaxy)”案例征集活动结果正式公布。由工银瑞信基金管理有限公司、北京原点数安科技有限公司联…

【0x001D】HCI_Read_Remote_Version_Information命令详解

目录 一、命令概述 二、命令格式及参数说明 2.12. HCI_Read_Remote_Version_Information 命令格式 2.2. Connection_Handle 三、生成事件 3.1. HCI_Command_Status 事件 3.2. HCI_Read_Remote_Version_Information_Complete 事件 四、命令执行流程 4.1. 命令发起阶段(…

C语言-结构体内存大小

#include <stdio.h> #include <string.h> struct S1 { char a;//1 int b;//4 char c;//1 }; //分析 默认对齐数 成员对齐数 对齐数(前两个最小值) 最大对齐数 // 8 1 …

直流电源如何输出恒压源和恒流源

输出电流达到预定值时&#xff0c;变成稳流特性。 输出电压达到预定值时&#xff0c;变成稳压特性。 电流变大&#xff0c;成稳压。 电压变大&#xff0c;成稳流。

【软考高级】系统架构设计师复习笔记-精华版

文章目录 前言0 系统架构设计师0.1 考架构还是考系分0.2 架构核心知识0.3 架构教材变化 1 计算机操作系统1.1 cpu 组成1.2 内核的五大功能1.3 流水线技术1.4 段页式存储1.5 I/O 软件1.6 文件管理1.7 系统工程相关 2 嵌入式2.1 嵌入式技术2.2 板级支持包&#xff08;BSP&#xf…

如何识别钓鱼邮件和诈骗网站?(附网络安全意识培训PPT资料)

识别钓鱼邮件和诈骗网站是网络安全中的一个重要环节。以下是一些识别钓鱼邮件和诈骗网站的方法&#xff1a; 识别钓鱼邮件&#xff1a; 检查发件人地址&#xff1a; 仔细查看发件人的电子邮件地址&#xff0c;看是否与官方域名一致。 检查邮件内容&#xff1a; 留意邮件中是否…

查询 MySQL 默认的存储引擎(SELECT @@default_storage_engine;)

要查询 MySQL 默认的存储引擎&#xff0c;可以使用以下 SQL 查询语句&#xff1a; SELECT default_storage_engine;解释&#xff1a; SELECT: 表示你要执行一个查询。default_storage_engine: 这是一个 MySQL 系统变量&#xff0c;它存储着当前 MySQL 服务器的默认存储引擎。…

ROM修改进阶教程------修改刷机包init.rc 自启用户自定义脚本的一些基本操作 代码格式与注意事项

在很多定制化固件中。我们需要修改系统的rc文件来启动自己的一些脚本。但有时候修改会不起作用,其具体原因在于权限与代码格式的问题。博文将系统的解析代码操作编写的注意事项与各种权限分别。了解以上. 轻松编写自定义启动脚本. 通过博文了解💝💝💝 1-------💝💝…

openwrt 负载均衡方法 openwrt负载均衡本地源接口

openwrt 负载均衡方法 openwrt负载均衡本地源接口_mob6454cc647bdb的技术博客_51CTO博客 本人注重原理分析&#xff0c;要求对其原理掌握&#xff0c;否则按教程操作&#xff0c;你怕是什么都学不会&#xff0c;仔细看&#xff0c;认真记比较好。 首先确认一下基本细节 1、路由…