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…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...

基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...

【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...
mongodb源码分析session执行handleRequest命令find过程
mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...

自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...

JVM 内存结构 详解
内存结构 运行时数据区: Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器: 线程私有,程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 每个线程都有一个程序计数…...