当前位置: 首页 > 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…...

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

Python爬虫实战:研究feedparser库相关技术

1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

2.Vue编写一个app

1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

GitHub 趋势日报 (2025年06月08日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“&#x1f916;手搓TuyaAI语音指令 &#x1f60d;秒变表情包大师&#xff0c;让萌系Otto机器人&#x1f525;玩出智能新花样&#xff01;开整&#xff01;” &#x1f916; Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制&#xff08;TuyaAI…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...

服务器--宝塔命令

一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行&#xff01; sudo su - 1. CentOS 系统&#xff1a; yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...

免费PDF转图片工具

免费PDF转图片工具 一款简单易用的PDF转图片工具&#xff0c;可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件&#xff0c;也不需要在线上传文件&#xff0c;保护您的隐私。 工具截图 主要特点 &#x1f680; 快速转换&#xff1a;本地转换&#xff0c;无需等待上…...

嵌入式常见 CPU 架构

架构类型架构厂商芯片厂商典型芯片特点与应用场景PICRISC (8/16 位)MicrochipMicrochipPIC16F877A、PIC18F4550简化指令集&#xff0c;单周期执行&#xff1b;低功耗、CIP 独立外设&#xff1b;用于家电、小电机控制、安防面板等嵌入式场景8051CISC (8 位)Intel&#xff08;原始…...

五子棋测试用例

一.项目背景 1.1 项目简介 传统棋类文化的推广 五子棋是一种古老的棋类游戏&#xff0c;有着深厚的文化底蕴。通过将五子棋制作成网页游戏&#xff0c;可以让更多的人了解和接触到这一传统棋类文化。无论是国内还是国外的玩家&#xff0c;都可以通过网页五子棋感受到东方棋类…...