C++设计模式(Design Patterns)

设计模式主要原则

  • 单一职责原则(Single Responsibility Principle)

实现类要职责单一

  • 里氏替换原则(Liskov Substitution Principle)

不要破坏继承关系

  • 依赖倒置原则(Dependence Inversion Principle)

面向接口编程

  • 接口隔离原则(Interface Segregation Principle)

设计接口时要精简单一,提供尽可能小的单独接口

  • 迪米特法则(Law Of Demeter)

最少知识原则,尽量少的发生相互作用

  • 开闭原则(Open Closed Principle)

可扩展,但不可修改

  • 合成复用原则(Composite Reuse Principle)

优先组合或聚合,其次才是考虑继承

设计模式

一、创建型模式(Creational)5种

        关注对象的创建过程,对类的实例化过程进行抽象,描述如何将对象的创建和使用分离。

1、工厂方法模式(Factory Method)

定义了一个用于创建对象的接口,让类的实例化延迟到子类中实现

抽象产品——具体产品

抽象工厂——具体工厂

主要优点:

        要添加新的产品时,无需修改抽象工厂和抽象产品提供的接口,无需修改客户端,也无需修改其他的具体工厂和具体产品,只要添加一个具体工厂和具体产品即可,从而提高系统的可扩展性(开闭原则)

2、抽象工厂模式(Abstract Factory)

定义一系列相关或相互依赖创建对象的接口,而无需指定具体的类

抽象产品——具体产品

抽象工厂——具体工厂

主要优点:

        当有多于一个的产品族时,可以动态的改变产品族,也可以方便增加新的产品族

3、单例模式(Singleton)

确保一个类只有一个实例,并提供一个全局访问点来访问

主要优点:

        提供唯一实例的受控访问

4、建造者模式(Builder)

将一个复杂对象的构建与它的表示分离,在客户不知道对象的建造过程和细节的情况下就可以直接创建复杂的对象

产品

抽象建造者——具体建造者

客户

主要优点:

        建造者模式负责按顺序创建复杂对象,隐藏内部的建造过程和细节

        代码复用性和封装性

5、原型模式(Prototype)

通过复制原型来创建新的对象

抽象原型——具体原则

客户

主要优点:

        简化对象的创建过程

        可以通过深克隆的方式保存对象的状态,以便在需要的时候使用

二、结构型模式(Structural)7种

1、桥接模式(Bridge)

将抽象与实现分离,使它们可以独立变化(用聚合关系代替继承关系来实现,抽象层聚合)

抽象对象——扩展抽象对象

抽象实现化——具体实现化

主要优点:

        抽象类和实现类之间增加更多的灵活性

        解决继承或多层次继承导致系统类数量剧增的问题

2、适配器模式(Adapter)

将一个类的接口转换成另一个接口,让本来接口不兼容的类能够一起使用

适配器模式分为类结构型模式和对象结构型模式

目标接口

适配类

适配器类(转换器)

主要优点:

        客户可以透明调用目标接口 

        复用了现存代码

3、装饰模式(Decorator)

动态地给对方增加一些职责,也就是增加额外功能

抽象对象——具体对象

抽象装饰对象——具体装饰对象

主要优点

        扩展方式比采用继承方法更加灵活

主要应用场景

        现有类被隐藏或终极类或继承方式繁琐

        一些基本功能排列组合而产生很多功能

        动态添加或动态撤销新能力

4、组合模式(Composite)

又叫部分-整体模式,它是一种将对象组合成树状的层次结构的模式,用来表示“部分-整体”的关系,使客户对单个对象和组合对象具有一致的访问性

主要优点:

        对单个对象和组合对象有一致性的处理

        容易在组体内加入新对象

5、享元模式(Flyweight)

运用共享技术来有效的支持大量细粒度对象的复用

享元模式两种状态:

        内部状态:不会随环境变化的可共享部分

        外部状态:随环境变化的不可共享部分

抽象享元——具体享元

非享元

享元工厂

主要优点:

        相同对象只要保存一份,这降低了系统中对象的数量,从而降低了系统中细粒度对象给内存带来的压力(存在大量相同或相似的对象时使用此模式才会带来好处)

6、外观模式(Facade)

为多个复杂的子系统提供一个一致的接口,使这些子系统能够更容易被访问

抽象外观——外观

子系统

客户

主要优点:

        降低了客户与子系统之间的耦合度

        屏蔽子系统组件,使用更容易

7、代理模式(Proxy)

为某对象提供一种代理以控制对象的访问(限制、增强或修改该对象的一些特征)

抽象产品类——具体产品类

代理类

客户类

主要优点:

        将客户和目标对象分离,以控制对象的访问

主要应用场景:

        远程代理

        虚拟代理

        安全代理

        智能指引

        延迟加载

三、行为型模式(Behavioral)11种

1、模板模式(Template)

一个抽象类定义了算法的通用框架,子类继承实现具体算法

主要优点:

        易于修改或扩展那些被复用的实现

2、策略模式(Strategy)

算法封装到一个类里面,通过组合的方式将具体算法的实现在组合对象中实现

主要优点:

        不知道对象内部细节也可以复用

        依赖性小

        可以在运行期间动态定义实现

3、状态模式(State)

在不同的状态下会有不同表现,而一个状态又会在不同的表现下转移到下一个不同的状态(状态机FSM)

主要优点:

        将状态逻辑和动作实现进行分离

4、观察者模式(Observer)

也称为发布-订阅模式,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动更新

5、备忘录模式(Memento)

又叫快照模式,是要在不破坏封装行的前提下,捕获并保存一个类的内部状态,这样就可以利用该保存的状态实施恢复操作

6、中介者模式(Mediator)

提供将对象间的交互和通讯封装在一个类中,各个对象间的通信不用显示声明和引用,大大降低了系统的复杂性能

主要优点:

        集中控制,便于管理

7、命令模式(Command)

将请求封装到一个对象 中,并将请求激活交给具体的处理对象操作,实现调用操作的对象和操作的具体实现者之间的解耦

8、访问者模式(Visitor)

将变更封装到一个类中,并由待更改类提供一个接收接口,这样访问者对象就可以处理元素对象上的操作

主要优点:

        可以使得对象元素在不修改自己的同时增加新的操作

9、责任链模式(Chain Of Responsibility)

将可能处理一个请求的对象链接成一个链,并将请求在这个链上传递,直到有对象处理该请求
主要优点
        极大地降低了系统的耦合性

10、迭代器模式(Iterator)

用来解决对一个聚合对象的遍历问题,将对聚合的遍历封装到一个类中进行,这样避免暴露该对象的内部表示

11、解释器模式(Interpreter)

使用一个解释器为用户提供一个一门定义语言的语法表示的解释器,然后通过这个解释器来解释语言中的句子

主要优点:

        可以提供了一种很好的组织和设计解析器的框架

        使用类来表示文法规则,因此可以很容易实现文法的扩展

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

xxl-job 2.2之后版本高版本executor未授权访问漏洞

xxl-job 低版本executor未授权访问 低版本的executor未授权访问漏洞是 POST /run HTTP/1.1 Host: your-ip:9999 Accept-Encoding: gzip, deflate Accept: */* Accept-Language: en User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like G…

Servlet开发-通过代码案例熟悉HttpServletRequest类

关于Servlet开发的流程推荐看servlet开发-通过Tomcat部署一个简单的webapp Servlet开发与idea集成的插件安装推荐看idea集成tomcat(Smart Tomcate插件安装) postman(第三方创建HTTP请求工具)的安装推荐看创建HTTP请求的几种方式…

LEO天线,全球市场总体规模,头部前八大厂商排名及市场份额

LEO天线全球市场总体规模 据QYResearch调研团队最新报告“全球LEO天线市场报告2023-2029”显示,预计2029年全球LEO天线市场规模将达到3545.3百万美元,未来几年年复合增长率CAGR为29.6%。 主要驱动因素: 近年来,全球航天工业的投资激增&#…

Archlinux Timeshift的系统备份与还原

服务器在滚挂或误删系统文件,timeshift系统备份与还原的情景: 安装 timeshif 1 yay -s timeshif 备份设置 选择快照类型 此处选择【RSYNC】 选择储存位置 每台设备安装分区不一样,大家安装实际情况选择,一般选择比较大的空间存储,并且最好是机械,这样不容易损坏 设置计…

PHP开发框架及特点

PHP有许多开发框架,每个框架都有其独特的特点和用途。以下是一些常见的PHP开发框架以及它们的特点,希望对大家有所帮助。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎交流合作。 1.Laravel Laravel是一个流行的PHP框架…

前沿研究|16s+宏基因组binning揭示大型藻类附生微生物群落核心组成

发表期刊:Microbiome 发表时间:2023 影响因子:15.5 DOI: 10.1186/s40168-023-01559-1 研究背景 大型藻类附生微生物群落是新型酶类和化合物的丰富资源,在维持沿海系统的高生物生产力和生物多样性方面发挥着重要的作用。但迄今…

【kylin】【ubuntu】搭建本地源

文章目录 一、制作一个本地源仓库制作ubuntu本地仓库制作kylin本地源 二、制作内网源服务器ubuntu系统kylin系统 三、使用内网源ubuntukylin 一、制作一个本地源仓库 制作ubuntu本地仓库 首先需要构建一个本地仓库,用来存放软件包 mkdir -p /path/to/localname/pac…

HTTP 协商缓存 Last-Modified,If-Modified-Since

浏览器第一次跟服务器请求一个资源,服务器在返回这个资源的同时,在respone header加上Last-Modified属性(表示这个资源在服务器上的最后修改时间): ----------------------------------------------------------------…

太实用了! 20分钟彻底理解【Pointpillars论文】,妥妥的!

PointPillars: Fast Encoders for Object Detection from Point Clouds PointPillars:快就对了 摘要(可跳过): 这帮人提出了PointPillars,一种新颖的编码器,它利用PointNets来学习以垂直列组织的点云&am…

【WSN】无线传感器网络模拟器研究(Matlab代码实现)

目录 💥1 概述 📚2 运行结果 🎉3 参考文献 🌈4 Matlab代码实现 💥1 概述 我们进行了一项关于无线传感器网络(WSN)模拟器的研究,旨在提供更好的协议应用和实时更新的能力。 首先&am…

华为---STP协议简介(一)

生成树协议简介 什么是生成树协议 STP(Spanning Tree Protocol)是一种由交换机运行的、用来解决交换网络中环路问题的数据链路层协议。为提高网络可靠性,交换网络中通常会使用冗余链路,但是冗余链路会给交换网络带来环路风险&…

网工内推 | H3C售前工程师,上市公司,13薪,有带薪年假、年终奖

01 长虹佳华 招聘岗位:高级售前工程师(H3C) 职责描述: 1. 负责公司签约代理的网络安全产品在区域的项目售前技术支持工作,包括项目售前交流、方案编写、招投标、产品测试等相关支持工作; 2. 与厂商产品部门…

nodejs在pdf中绘制表格

需求 之前我已经了解过如何在pdf模板中填写字段了 nodejs根据pdf模板填入中文数据并生成新的pdf文件https://blog.csdn.net/ArmadaDK/article/details/132456324 但是当我具体使用的时候,我发现我的模板里面有表格,表格的长度是不固定的,所…

Python入门自学进阶-Web框架——42、Web框架了解-bottle、flask

WEB框架的三大组件:路由系统、控制器(含模板渲染)、数据库操作 微型框架:依赖第三方写的socket,WSGI, 本身功能少 安装: pip install bottle pip install flask 安装flask,同时安…

conan入门(二十七):因profile [env]字段废弃导致的boost/1.81.0 在aarch64-linux-gnu下交叉编译失败

今天在尝试用conan 1.60.0使用aarch64-linux-gnu编译器交叉编译boost/1.81.0时报错了: conan install boost/1.81.0 -pr:h aarch64-linux-gnu.jinja -pr:b default --build boost输出如下: Configuration (profile_host): [settings] archarmv8 arch_b…

SQL做流水号

SELECT REPLICATE(0, 3 - LEN(3)) 3 AS 流水号 SELECT REPLICATE(0, 5 - LEN(3)) 3 AS 流水号 SELECT REPLICATE(0, 8 - LEN(3)) 3 AS 流水号

Java中String转换为double类型

这次的java作业是写一个数字转换的小项目,其中从输入框中获取的是String类型,但是要进行数字操作,此时要用到很多操作String类型数据的方法了。 从javafx输入框中获取到String类型后,首先是要判断是否能转换为数字或者小数形式&a…

实验三十三、三端稳压器 LM7805 稳压性能的研究

一、题目 LM7805 输出电压、电压调整率、电流调整率以及输出纹波电压的研究。 二、仿真电路 电路如图1所示。集成稳压芯片采用 LM7805CT。 三、仿真内容 (1)测量图1(a)LM7805CT 的电压调整率,测量条件为 I O 50…

嵌入式Linux应用开发-基础知识-第十七章异常与中断的概念及处理流程

嵌入式Linux应用开发-基础知识-第十七章异常与中断的概念及处理流程 第十七章 异常与中断的概念及处理流程17.1 中断的引入17.1.1 妈妈怎么知道孩子醒了17.1.2 嵌入系统中也有类似的情况 17.2 中断的处理流程17.3 异常向量表17.4 参考资料 第十七章 异常与中断的概念及处理流程…

【C语言】快速排序

文章目录 一、hoare版本二、挖坑法三、前后指针法四、非递归快排五、快速排序优化1、三数取中选key值2、小区间优化 六、代码测试 一、hoare版本 快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法,其基本思想为:任取待排序元素序列中的某元素…