当前位置: 首页 > 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;你是不是也头疼&#xff1f;选题要么太简单&#xff0c;像学生信息管理&#xff0c;做出来感觉没深度&#xff1b;要么太复杂&#xff0c;比如电商系统&#xff0c;光表关系就画晕…...

避坑指南:Dify 1.3.1 Docker-Compose部署时,除了镜像拉取慢,你还会遇到的3个典型错误

Dify 1.3.1 Docker-Compose部署实战&#xff1a;3个隐藏陷阱与深度排错指南 当你决定在生产环境部署Dify 1.3.1时&#xff0c;Docker-Compose看似简单的up -d命令背后可能暗藏玄机。本文将从真实故障场景出发&#xff0c;解剖那些官方文档未曾提及的"暗坑"——它们不…...

Micro Debug:Arduino极简嵌入式调试库

1. 项目概述Micro Debug 是一个专为 Arduino 平台设计的极简式嵌入式调试库&#xff0c;其核心设计哲学是“零依赖、零开销、零侵入”——不引入任何额外的硬件资源占用&#xff08;如额外串口、定时器或DMA通道&#xff09;&#xff0c;不增加运行时调度负担&#xff08;无任务…...

【独家首发】Python WASM安全白皮书:XSS绕过、WASI权限逃逸、沙箱逃逸——3类高危漏洞POC及修复代码(限前500名开发者获取)

第一章&#xff1a;Python WASM安全白皮书导论 WebAssembly&#xff08;WASM&#xff09;正迅速成为云原生、边缘计算与浏览器沙箱场景中关键的安全执行载体。随着 Python 生态对 WASM 的支持逐步成熟&#xff08;如 Pyodide、WASI-SDK 与 GraalPy 的跨编译能力&#xff09;&am…...

从Hightec/TASKING到ADS:手把手教你迁移AURIX工程并优化编译配置

1. 为什么需要从Hightec/TASKING迁移到ADS&#xff1f; 对于使用AURIX系列芯片的开发者来说&#xff0c;Hightec和TASKING这两个商业IDE一直是主流选择。但最近几年&#xff0c;越来越多的开发者开始转向英飞凌官方推出的AURIX Development Studio&#xff08;ADS&#xff09;&…...

从期末试卷到实战指南:通信原理核心考点深度解析与应用

1. 从试卷到实战&#xff1a;HDB3码的工程应用解析 当年我第一次在实验室调试E1线路时&#xff0c;遇到时钟同步问题差点崩溃。示波器上那些诡异的波形让我突然想起期末考卷里那道HDB3码的考题——原来教授不是在为难我们&#xff0c;而是在为今天的实战埋下伏笔。 HDB3码作为通…...

飞书文档转Markdown效率低下?Cloud Document Converter实现2分钟精准转换提升75%工作效率

飞书文档转Markdown效率低下&#xff1f;Cloud Document Converter实现2分钟精准转换提升75%工作效率 【免费下载链接】cloud-document-converter Convert Lark Doc to Markdown 项目地址: https://gitcode.com/gh_mirrors/cl/cloud-document-converter 在企业文档管理场…...

实战解析:Element UI在Vue项目中的高效开发技巧

1. 为什么选择Element UI开发Vue项目 Element UI作为Vue生态中最受欢迎的UI组件库之一&#xff0c;在中后台管理系统开发中占据着不可替代的地位。我最早接触Element UI是在2018年开发一个电商后台系统时&#xff0c;当时对比了多个UI框架后&#xff0c;最终选择它的原因很简单…...

基于Session管理的在线视频学习平台防作弊策略

1. Session管理在在线学习平台中的核心作用 在线视频学习平台最头疼的问题之一&#xff0c;就是如何防止用户通过多设备同时登录来刷学习进度。想象一下&#xff0c;如果用户同时在手机、平板和电脑上登录同一个账号&#xff0c;三倍速刷完课程&#xff0c;这对其他认真学习的用…...

告别Softmax分类头:用K-Means思想在PyTorch里实现语义分割原型网络

告别Softmax分类头&#xff1a;用K-Means思想在PyTorch里实现语义分割原型网络 当你在Cityscapes数据集上调试语义分割模型时&#xff0c;是否遇到过这样的困境&#xff1a;增加新类别需要重新调整分类头参数&#xff0c;模型在复杂场景下对同类物体的多样性特征捕捉不足&#…...