GOF的C++软件设计模式的分类和模式名称
“GOF” 指的是 “Gang of Four”,即“四人帮”,他们是指 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides。这四位作者在其著作《Design Patterns: Elements of Reusable Object-Oriented Software》中定义了23种设计模式,这些模式被广泛应用于软件开发中。根据他们解决问题的性质,设计模式可以分为三大类:创建型模式、结构型模式和行为型模式。
1. 创建型模式(Creational Patterns)
创建型模式主要关注如何创建对象,目的是通过使用不同的方式来创建对象,从而增强程序的灵活性和可复用性。
- 单例模式(Singleton):确保一个类仅有一个实例,并提供全局访问点。
- 工厂方法模式(Factory Method):定义一个创建对象的接口,但由子类决定要实例化的类。
- 抽象工厂模式(Abstract Factory):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
- 建造者模式(Builder):使用多个简单的对象一步步构建成一个复杂的对象。
- 原型模式(Prototype):通过复制已有的实例来创建新的对象,而不是通过类构造。
2. 结构型模式(Structural Patterns)
结构型模式关注类或对象的组合,旨在通过组合现有类或对象来形成更大的结构。
- 适配器模式(Adapter):将一个类的接口转换成客户希望的另一个接口。
- 桥接模式(Bridge):将抽象部分与其实现部分分离,使它们可以独立变化。
- 组合模式(Composite):将对象组合成树形结构以表示部分-整体的层次结构。
- 装饰模式(Decorator):动态地给对象添加职责或行为。
- 外观模式(Facade):为子系统中的一组接口提供一个统一的高层接口。
- 享元模式(Flyweight):通过共享对象来减少内存占用,适用于大量相似对象的场景。
- 代理模式(Proxy):通过代理对象控制对某个对象的访问,通常用于控制对象的访问或增加额外的功能。
3. 行为型模式(Behavioral Patterns)
行为型模式主要关注对象之间的交互,提供了对象之间的责任分配和通信方式。
- 责任链模式(Chain of Responsibility):将请求的发送者和接收者解耦,让多个对象都有机会处理请求。
- 命令模式(Command):将请求封装为一个对象,从而使你可以对请求排队或记录请求日志,以及支持可撤销的操作。
- 解释器模式(Interpreter):提供一种语言的文法的解释器,主要用于构建语言解析器。
- 迭代器模式(Iterator):提供一种方法访问一个集合对象中的各个元素,而不暴露该对象的内部表示。
- 中介者模式(Mediator):用一个中介对象封装一系列的对象交互,促进松耦合。
- 备忘录模式(Memento):在不破坏封装的情况下,捕获对象的内部状态,并在适当时刻恢复。
- 观察者模式(Observer):定义对象之间的一对多依赖关系,以便当一个对象改变状态时,所有依赖于它的对象都得到通知并自动更新。
- 状态模式(State):允许对象在内部状态改变时改变它的行为,使状态的改变看起来像是改变了对象。
- 策略模式(Strategy):定义一系列算法,并将每一个算法封装起来,使它们可以互换。
- 模板方法模式(Template Method):在一个方法中定义一个算法的框架,而将一些步骤延迟到子类中。
- 访问者模式(Visitor):表示一个作用于某种数据结构中的各元素的操作,能够在不修改数据结构的前提下定义新的操作。
关注的问题
GOF设计模式着重解决以下问题:
- 创建问题:如何有效创建对象与控制对象的生命周期(如单例或工厂模式)。
- 结构问题:如何更高效地组合不同的类和对象以形成复杂的结构(如组合或适配器模式)。
- 行为问题:如何高效地处理对象之间的交互和责任分配(如观察者、命令和策略模式)。
设计模式的使用不仅可以提升代码的可读性和可维护性,还能提高代码的复用性和灵活性。理解这些模式及其应用场景将有助于设计出更高质量的软件系统。
相关文章:
GOF的C++软件设计模式的分类和模式名称
“GOF” 指的是 “Gang of Four”,即“四人帮”,他们是指 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides。这四位作者在其著作《Design Patterns: Elements of Reusable Object-Oriented Software》中定义了23种设计模式,这些…...
有向图的完全可达性(有向图搜索全路径的问题) C#DFs
在考察输入输出方面我觉得是道难题了 第一次遇见邻接表的数据结构该怎么声明 卡码网105 在力扣没找见完全相同的题 感觉需要多练习多复习这种类型的题 105. 有向图的完全可达性 题目描述 给定一个有向图,包含 N 个节点,节点编号分别为 1&…...
前端开发实现自定义勾选/自定义样式,可复选,可取消勾选
基于后端返回数组实现多选、复选 以下代码基于vue2,如果有需要React/Vue3或者其他框架代码的,可以通过国内直连GPT4o进行代码转换,转换正确率99% 前端代码如下(直接拷贝到你的vue代码即可): <!-- CustomCheckboxList.vue --&g…...
鸿蒙-promptAction.showToast基于PC屏幕底部提示
PC端app缩小,右击出菜单后,点菜单项 菜单关闭,并弹promptAction.showToast提示,但提示是基于PC底部弹提示的,需要的是基于app底部弹提示 原因是UIContext是右击菜单的UIContext,需要拿到菜单下面UI的UICont…...
Vert.x,应用监控 - 全链路跟踪,基于Zipkin
关于Zipkin Zipkin是一款开源的分布式实时数据追踪系统(Distributed Tracking System),能够收集服务间调用的时序数据,提供调用链路的追踪。Zipkin每一个调用链路通过一个trace id来串联起来,通过trace id,就能够直接定位到这次调…...
Rust常用数据结构教程 序列
文章目录 一、Vec1.Vec与堆栈2.什么时候需要Vec3.get()方法4.与枚举的结合 二、VecDeque1.什么情况适合VecDeque2.VecDeque的方法 三、LinkedList1.什么时候用LinkedList 参考 一、Vec 可变数组(vector)数组存储在heap上,在运行时(runtime)可以增加或减少数组 长度 有人把Ve…...
智慧城市路面垃圾识别系统产品介绍方案
方案介绍 智慧城市中的路面垃圾识别算法通常基于深度学习框架,这些算法因其在速度和精度上的优势而被广泛采用。这些模型能够通过训练识别多种类型的垃圾,包括塑料袋、纸屑、玻璃瓶等。系统通过训练深度学习模型,使其能够识别并定位多种类型…...
网络安全:构建坚固的数字堡垒
网络安全:构建坚固的数字堡垒 在当今数字化时代,网络安全已经成为企业和个人不可忽视的重要议题。随着互联网的普及和信息技术的快速发展,网络攻击、数据泄露和隐私侵犯等问题日益严重,给企业和个人带来了巨大的风险和损失。本文…...
LeetCode题练习与总结:打乱数组--384
一、题目描述 给你一个整数数组 nums ,设计算法来打乱一个没有重复元素的数组。打乱后,数组的所有排列应该是 等可能 的。 实现 Solution class: Solution(int[] nums) 使用整数数组 nums 初始化对象int[] reset() 重设数组到它的初始状态并返回int[]…...
科技改变生活:最新智能开关、调光器及插座产品亮相
根据QYResearch调研团队的最新力作《欧洲开关、调光器和插座市场报告2023-2029》显示,预计到2029年,欧洲开关、调光器和插座市场的规模将攀升至57.8亿美元,并且在接下来的几年里,将以4.2%的复合年增长率(CAGRÿ…...
传统RAG流程;密集检索器,稀疏检索器:中文的M3E
目录 传统RAG流程 相似性搜索中:神经网络的密集检索器,稀疏检索器 密集检索器 BGE系列模型 text-embedding-ada-002模型 M3E模型 稀疏检索器 示例一:基于TF-IDF的稀疏检索器 示例二:基于BM25的稀疏检索器 稀疏检索器的特点与优势 传统RAG流程 相似性搜索中:神经…...
基于统计方法的语言模型
基于统计方法的语言模型 基于统计方法的语言模型主要是指利用统计学原理和方法来构建的语言模型,这类模型通过分析和学习大量语料库中的语言数据,来预测词、短语或句子出现的概率。 N-gram模型:这是最基础的统计语言模型之一,它基…...
Flux comfyui 部署笔记,整合包下载
目录 comfyui启动: 1、下载 Flux 模型 2、Flux 库位置 工作流示例: Flux学习资料免费分享 comfyui启动: # 配置下载模型走镜像站 export HF_ENDPOINT="https://hf-mirror.com" python3 main.py --listen 0.0.0.0 --port 8188 vscode 点击 port 映射到本地,…...
高性能分布式缓存Redis-数据管理与性能提升之道
一、持久化原理 Redis是内存数据库,数据都是存储在内存中,为了避免进程退出导致数据的永久丢失,需要定期将Redis中的数据以某种形式(数据或命令)从内存保存到硬盘;当下次Redis重启时,利用持久化文件实现数据恢复。除此…...
BO-CNN-LSTM回归预测 | MATLAB实现BO-CNN-LSTM贝叶斯优化卷积神经网络-长短期记忆网络多输入单输出回归预测
BO-CNN-LSTM回归预测 | MATLAB实现BO-CNN-LSTM贝叶斯优化卷积神经网络-长短期记忆网络多输入单输出回归预测 目录 BO-CNN-LSTM回归预测 | MATLAB实现BO-CNN-LSTM贝叶斯优化卷积神经网络-长短期记忆网络多输入单输出回归预测效果一览基本介绍模型搭建程序设计参考资料 效果一览 …...
DataWind将字符串数组拆出多行的方法
摘要: 可视化建模中先将字符串split为array再用explode(array)即可 可视化建模 进入“可视化建模”页面 1.1 新建任务 如果团队内没有可视化建模任务。请点击“新建任务”,输入名称并确定。 1.2 建立数据连接 在左边栏中选择“数据连接”,…...
try...catch 和then...catch的异同点分析
try…catch 和 then…catch 的异同点分析 在现代 JavaScript 编程中,异常处理和 Promise 的处理是非常常见的两种方式。try...catch 语句主要用于同步代码的异常处理,而 .then().catch() 是 Promise 中的异步处理方法。 1. 基础概念 1.1 try…catch …...
Mit6.S081-实验环境搭建
Mit6.S081-实验环境搭建 注:大家每次做一些操作的时候觉得不太保险就先把虚拟机克隆一份 前言 qemu(quick emulator):这是一个模拟硬件环境的软件,利用它可以运行我们编译好的操作系统。 准备一个Linux系统…...
以太网交换安全:MAC地址漂移
一、什么是MAC地址漂移? MAC地址漂移是指设备上一个VLAN内有两个端口学习到同一个MAC地址,后学习到的MAC地址表项覆盖原MAC地址表项的现象。 MAC地址漂移的定义与现象 基本定义:MAC地址漂移发生在一个VLAN内的两个不同端口学习到相同的MAC地…...
STM32实现串口接收不定长数据
原理 STM32实现串口接收不定长数据,主要靠的就是串口空闲(idle)中断,此中断的触发条件与接收的字节数无关,只有当Rx引脚无后续数据进入时(串口空闲时),认为这时候代表一个数据包接收完成了&…...
KubeSphere 容器平台高可用:环境搭建与可视化操作指南
Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...
Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...
Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)
在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...
视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)
前言: 最近在做行为检测相关的模型,用的是时空图卷积网络(STGCN),但原有kinetic-400数据集数据质量较低,需要进行细粒度的标注,同时粗略搜了下已有开源工具基本都集中于图像分割这块,…...
MySQL JOIN 表过多的优化思路
当 MySQL 查询涉及大量表 JOIN 时,性能会显著下降。以下是优化思路和简易实现方法: 一、核心优化思路 减少 JOIN 数量 数据冗余:添加必要的冗余字段(如订单表直接存储用户名)合并表:将频繁关联的小表合并成…...
SQL Server 触发器调用存储过程实现发送 HTTP 请求
文章目录 需求分析解决第 1 步:前置条件,启用 OLE 自动化方式 1:使用 SQL 实现启用 OLE 自动化方式 2:Sql Server 2005启动OLE自动化方式 3:Sql Server 2008启动OLE自动化第 2 步:创建存储过程第 3 步:创建触发器扩展 - 如何调试?第 1 步:登录 SQL Server 2008第 2 步…...
