当前位置: 首页 > news >正文

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)

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

主要优点:

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

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

相关文章:

C++设计模式(Design Patterns)

设计模式主要原则 单一职责原则(Single Responsibility Principle) 实现类要职责单一 里氏替换原则(Liskov Substitution Principle) 不要破坏继承关系 依赖倒置原则(Dependence Inversion Principle) …...

vue点击按钮收缩菜单

问题描述 VUE菜单有一个BUG,当我们点击其它按钮或者首页的时候,已经展示的一级菜单是不会自动收缩的。这个问题也导致很多开发者把一级菜单都换成了二级菜单。 错误展示 错误的效果请看下图。 解决方法 1、寻找菜单文件 因为我使用的是ruoyi的前端框…...

Vue 防止忘记的命令

创建新项目 npm init vuelatest cd <项目名> npm install npm run dev 运行项目 yarn yarn serve 这里如果我用npm install 或者npm run serve会报错&#xff0c;但是新建项目用npm就不会&#xff0c;有大佬知道为什么吗...

APACHE NIFI学习之—RouteOnContent

RouteOnContent 描述: 通过正则表达式匹配输入数据流的内容,然后将输入数据流的副本路由到正则表达式相匹配的输出数据流。 正则表达式作为用户自定义的属性添加,并以该属性名称为输出连线,其值为正则表达式所匹配数据流内容。 当用户定义的属性支持属性表达式语言时,其结…...

【C语言】【结构体的内存对齐】计算结构体内存大小,有图解

计算结构体内存大小&#xff0c;需要用到结构体内存对齐的知识 来段代码看看什么是结构体对齐&#xff1a; #include<stdio.h> struct S1 {char a;char b;int num; }; struct S2 {char a;int num;char b; }; int main() {printf("%zd\n", sizeof(struct S1))…...

Intel 700 800系网卡升级支持WOL UEFI PXE方法

Intel 700 800系网卡默认的NVM版本是不支持UEFI的&#xff0c;升级NVM也不能解决&#xff0c;需要将UEFI driver 包到NVM里。操作步骤如下&#xff1a; 1. 下载Preboot软件包&#xff0c;有Windows和Linux版本&#xff0c;本次使用Linux版本做示例。 Intel Ethernet Connecti…...

vue3 - 使用 xlsx 库将数据导出到 Excel 文件

GitHub Demo 地址 在线预览 xlsx是由SheetJS开发的一个处理excel文件的JavaScript库。它可以读取、编写和操作 Excel 文件 安装xlsx npm install xlsx --save实现一个通过的数据导出工具类 import * as XLSX from xlsx/*** description: 导出excel* param {any} dataList* p…...

机器学习,深度学习

一 、Numpy 1.1 安装numpy 2.2 Numpy操作数组 jupyter扩展插件&#xff08;用于显示目录&#xff09; 1、pip install jupyter_contrib_nbextensions -i https://pypi.tuna.tsinghua.edu.cn/simple 2、pip install jupyter_nbextensions_configurator -i https://pypi.tuna.t…...

【性能测试】jmeter连接数据库jdbc

一、下载第三方工具包驱动数据库   1. 因为JMeter本身没有提供链接数据库的功能&#xff0c;所以我们需要借助第三方的工具包来实现。 &#xff08;有这个jar包之后&#xff0c;jmeter可以发起jdbc请求&#xff0c;没有这个jar包&#xff0c;也有jdbc取样器&#xff0c;但不能…...

蓝桥等考Python组别二级007

第一部分:选择题 1、Python L2 (15分) 下面哪个不是Python的基本数据类型?( ) 布尔型整数型指针型字符串正确答案:C 2、Python L2...

Java如何解决浮点数计算不精确问题

有的时候博客内容会有变动&#xff0c;首发博客是最新的&#xff0c;其他博客地址可能会未同步,认准https://blog.zysicyj.top 首发博客地址[1] 面试题手册[2] 系列文章地址[3] 1. 什么是浮点数计算不精确问题? 在 Java 中&#xff0c;浮点数计算不精确问题指的是使用浮点数进…...

一图读懂「五度易链」企业创新服务解决方案,打造卓越营商环境!

“五度易链”紧密围绕园区企业及产业发展需求&#xff0c;基于数据积累和应用&#xff0c;创新企业服务机制&#xff0c;提升企业服务效能&#xff0c;以数字化手段为企业发展纾困解难&#xff0c;赋能企业高质量发展。并帮助园区在运营方面打破数据壁垒&#xff0c;实现数据监…...

软件工程 第一次随堂练习

以下答案是经过人工智能生成&#xff0c;个人理解得出的答案&#xff0c;若有不同见解&#xff0c;请在评论区留言或私信 说明下列需求分别属于下面的哪种类型&#xff0c;为什么&#xff1f; A.业务需求 B.用户需求 C.系统级&#xff08;功能&#xff09;需求 D.性能需求 E.质…...

在 Esp32 摄像头上实现边缘脉冲 FOMO 物体检测

轻松在 Esp32 相机上运行边缘脉冲 FOMO 物体检测的世界最佳指南。即使您是初学者 介绍 对象检测是检测图像内感兴趣的对象的任务。直到几年前,由于模型的复杂性和要执行的数学运算的数量惊人,这项任务还需要强大的计算机来完成。 然而,由于像Edge Impulse这样的平台,初学者…...

crypto:RSA

题目 利用代码跑一下解码 import gmpy2 e 17 p 473398607161 q 4511491 d gmpy2.invert(e,(p-1)*(q-1)) print(d)总结 RSA&#xff08;Rivest-Shamir-Adleman&#xff09;是一种非对称加密算法&#xff0c;常用于数据加密和数字签名。它基于两个大素数的乘积难以分解的数…...

APP产品经理岗位的具体内容(合集)

APP产品经理岗位的具体内容1 1、负责项目产品团队的管理工作&#xff0c;对项目产品团队考核目标负责; 2、全面负责“工务园”所有产品&#xff0c;全方位负责其生命周期管理; 3、按照产品管理相关的计划和规范&#xff0c;对产品版本的更新及发布负责&#xff0c;完善产品的…...

java 入门-使用eclipse、javaFX、SceneBuilder进行图形界面开发

个人是 一直在开C# CS端开发 &#xff0c; 目前 公司的软件 基本都使用了java作开发。 为了更好适应环境&#xff0c;我也只能再次学习这个陌生的开发工具。 java 的开发界面非常不友好 &#xff0c;对于我这样的初学者只能是借助插件来进行界面与后台联动&#xff0c; 上网度…...

集度汽车(武汉java)一面

hashMap底层结构&#xff0c;hash算法的好处是什么&#xff0c;为什么采用数组加链表&#xff0c;数组有哪些特性&#xff08;内存地址连续&#xff0c;查找快&#xff09;&#xff0c;怎么解决哈希碰撞&#xff0c;链地址法&#xff1b;并发编程需要注意哪些地方&#xff0c;如…...

虹科分享 | 为工业机器人解绑,IO-Link wireless无线通讯技术可实现更加轻量灵活的机器人协作

背景 机器人是一种能够半自主或全自主工作的智能机器。中国电子学会组织发布的《中国机器人产业发展报告&#xff08;2022年&#xff09;显示&#xff0c;近些年&#xff0c;我国机器人市场规模持续快速增长&#xff0c;“机器人”应用不断拓展深入&#xff0c;预计五年年均增…...

【PickerView案例10-国旗选择界面02 Objective-C预言】

一、好了,我们继续来实现这个国旗选择界面: 1.它的界面里面,是不是很简单,就一个UIPickerView,就完事儿了 然后,显示的每一行内容呢, 1)一个文字Label 2)一个图片 那大家应该有意识,它返回的应该是一个View,对吧, 代理方法里面,有一个返回View的,viewForRow…...

web vue 项目 Docker化部署

Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段&#xff1a; 构建阶段&#xff08;Build Stage&#xff09;&#xff1a…...

【杂谈】-递归进化:人工智能的自我改进与监管挑战

递归进化&#xff1a;人工智能的自我改进与监管挑战 文章目录 递归进化&#xff1a;人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管&#xff1f;3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

IGP(Interior Gateway Protocol,内部网关协议)

IGP&#xff08;Interior Gateway Protocol&#xff0c;内部网关协议&#xff09; 是一种用于在一个自治系统&#xff08;AS&#xff09;内部传递路由信息的路由协议&#xff0c;主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路

进入2025年以来&#xff0c;尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断&#xff0c;但全球市场热度依然高涨&#xff0c;入局者持续增加。 以国内市场为例&#xff0c;天眼查专业版数据显示&#xff0c;截至5月底&#xff0c;我国现存在业、存续状态的机器人相关企…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明

AI 领域的快速发展正在催生一个新时代&#xff0c;智能代理&#xff08;agents&#xff09;不再是孤立的个体&#xff0c;而是能够像一个数字团队一样协作。然而&#xff0c;当前 AI 生态系统的碎片化阻碍了这一愿景的实现&#xff0c;导致了“AI 巴别塔问题”——不同代理之间…...

让AI看见世界:MCP协议与服务器的工作原理

让AI看见世界&#xff1a;MCP协议与服务器的工作原理 MCP&#xff08;Model Context Protocol&#xff09;是一种创新的通信协议&#xff0c;旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天&#xff0c;MCP正成为连接AI与现实世界的重要桥梁。…...

是否存在路径(FIFOBB算法)

题目描述 一个具有 n 个顶点e条边的无向图&#xff0c;该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序&#xff0c;确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数&#xff0c;分别表示n 和 e 的值&#xff08;1…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 在 GPU 上对图像执行 均值漂移滤波&#xff08;Mean Shift Filtering&#xff09;&#xff0c;用于图像分割或平滑处理。 该函数将输入图像中的…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)

目录 一、&#x1f44b;&#x1f3fb;前言 二、&#x1f608;sinx波动的基本原理 三、&#x1f608;波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、&#x1f30a;波动优化…...