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…...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...

Kafka入门-生产者
生产者 生产者发送流程: 延迟时间为0ms时,也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于:异步发送不需要等待结果,同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...
Webpack性能优化:构建速度与体积优化策略
一、构建速度优化 1、升级Webpack和Node.js 优化效果:Webpack 4比Webpack 3构建时间降低60%-98%。原因: V8引擎优化(for of替代forEach、Map/Set替代Object)。默认使用更快的md4哈希算法。AST直接从Loa…...

Linux nano命令的基本使用
参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时,显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...
【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案
目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后,迭代器会失效,因为顺序迭代器在内存中是连续存储的,元素删除后,后续元素会前移。 但一些场景中,我们又需要在执行删除操作…...

关于easyexcel动态下拉选问题处理
前些日子突然碰到一个问题,说是客户的导入文件模版想支持部分导入内容的下拉选,于是我就找了easyexcel官网寻找解决方案,并没有找到合适的方案,没办法只能自己动手并分享出来,针对Java生成Excel下拉菜单时因选项过多导…...