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会报错,但是新建项目用npm就不会,有大佬知道为什么吗...
APACHE NIFI学习之—RouteOnContent
RouteOnContent 描述: 通过正则表达式匹配输入数据流的内容,然后将输入数据流的副本路由到正则表达式相匹配的输出数据流。 正则表达式作为用户自定义的属性添加,并以该属性名称为输出连线,其值为正则表达式所匹配数据流内容。 当用户定义的属性支持属性表达式语言时,其结…...
【C语言】【结构体的内存对齐】计算结构体内存大小,有图解
计算结构体内存大小,需要用到结构体内存对齐的知识 来段代码看看什么是结构体对齐: #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的,升级NVM也不能解决,需要将UEFI driver 包到NVM里。操作步骤如下: 1. 下载Preboot软件包,有Windows和Linux版本,本次使用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扩展插件(用于显示目录) 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本身没有提供链接数据库的功能,所以我们需要借助第三方的工具包来实现。 (有这个jar包之后,jmeter可以发起jdbc请求,没有这个jar包,也有jdbc取样器,但不能…...
蓝桥等考Python组别二级007
第一部分:选择题 1、Python L2 (15分) 下面哪个不是Python的基本数据类型?( ) 布尔型整数型指针型字符串正确答案:C 2、Python L2...
Java如何解决浮点数计算不精确问题
有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准https://blog.zysicyj.top 首发博客地址[1] 面试题手册[2] 系列文章地址[3] 1. 什么是浮点数计算不精确问题? 在 Java 中,浮点数计算不精确问题指的是使用浮点数进…...
一图读懂「五度易链」企业创新服务解决方案,打造卓越营商环境!
“五度易链”紧密围绕园区企业及产业发展需求,基于数据积累和应用,创新企业服务机制,提升企业服务效能,以数字化手段为企业发展纾困解难,赋能企业高质量发展。并帮助园区在运营方面打破数据壁垒,实现数据监…...
软件工程 第一次随堂练习
以下答案是经过人工智能生成,个人理解得出的答案,若有不同见解,请在评论区留言或私信 说明下列需求分别属于下面的哪种类型,为什么? A.业务需求 B.用户需求 C.系统级(功能)需求 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(Rivest-Shamir-Adleman)是一种非对称加密算法,常用于数据加密和数字签名。它基于两个大素数的乘积难以分解的数…...
APP产品经理岗位的具体内容(合集)
APP产品经理岗位的具体内容1 1、负责项目产品团队的管理工作,对项目产品团队考核目标负责; 2、全面负责“工务园”所有产品,全方位负责其生命周期管理; 3、按照产品管理相关的计划和规范,对产品版本的更新及发布负责,完善产品的…...
java 入门-使用eclipse、javaFX、SceneBuilder进行图形界面开发
个人是 一直在开C# CS端开发 , 目前 公司的软件 基本都使用了java作开发。 为了更好适应环境,我也只能再次学习这个陌生的开发工具。 java 的开发界面非常不友好 ,对于我这样的初学者只能是借助插件来进行界面与后台联动, 上网度…...
集度汽车(武汉java)一面
hashMap底层结构,hash算法的好处是什么,为什么采用数组加链表,数组有哪些特性(内存地址连续,查找快),怎么解决哈希碰撞,链地址法;并发编程需要注意哪些地方,如…...
虹科分享 | 为工业机器人解绑,IO-Link wireless无线通讯技术可实现更加轻量灵活的机器人协作
背景 机器人是一种能够半自主或全自主工作的智能机器。中国电子学会组织发布的《中国机器人产业发展报告(2022年)显示,近些年,我国机器人市场规模持续快速增长,“机器人”应用不断拓展深入,预计五年年均增…...
【PickerView案例10-国旗选择界面02 Objective-C预言】
一、好了,我们继续来实现这个国旗选择界面: 1.它的界面里面,是不是很简单,就一个UIPickerView,就完事儿了 然后,显示的每一行内容呢, 1)一个文字Label 2)一个图片 那大家应该有意识,它返回的应该是一个View,对吧, 代理方法里面,有一个返回View的,viewForRow…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...
wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...
(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...
关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...
YSYX学习记录(八)
C语言,练习0: 先创建一个文件夹,我用的是物理机: 安装build-essential 练习1: 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件,随机修改或删除一部分,之后…...
如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...
【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)
可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...
