当前位置: 首页 > news >正文

C++设计模式之行为型模式概述,它们的目的与特点

行为型设计模式需要解决的问题

行为型设计模式主要关注对象之间的责任分配交互。它们解决的问题包括:

  1. 对象之间的通信:如何让对象之间高效地通信,同时保持松耦合。
  2. 算法的封装与复用:如何将算法或行为封装起来,使其可以独立于使用它的对象而变化。
  3. 状态管理与行为变化:如何管理对象的状态,并根据状态的变化动态调整对象的行为。
  4. 请求的处理与传递:如何将请求的处理逻辑解耦,使其可以灵活地传递或扩展。
  5. 对象之间的协作:如何定义对象之间的协作关系,使其能够共同完成复杂的任务。

行为型模式的核心是对象的行为,而不是对象的创建或结构。它们通过定义对象之间的交互方式,使系统更加灵活、可扩展和易于维护。


行为型模式相对于创建型和结构型模式的特点

  1. 关注点不同

    • 创建型模式:关注对象的创建过程,解决如何实例化对象的问题。
    • 结构型模式:关注对象和类的组合,解决如何构建更大的结构的问题。
    • 行为型模式:关注对象之间的交互和职责分配,解决对象如何协作和通信的问题。
  2. 解决的问题不同

    • 创建型模式解决的是“如何创建对象”的问题。
    • 结构型模式解决的是“如何组织类和对象”的问题。
    • 行为型模式解决的是“对象如何交互和协作”的问题。
  3. 设计目标不同

    • 创建型模式的目标是解耦对象的创建与使用
    • 结构型模式的目标是简化复杂系统的结构
    • 行为型模式的目标是提高对象之间的灵活性和可扩展性
  4. 实现方式不同

    • 创建型模式通常通过封装创建逻辑来实现。
    • 结构型模式通常通过组合类或对象来实现。
    • 行为型模式通常通过定义对象之间的交互协议来实现。

行为型模式的各个模式及其意图

以下是行为型模式的详细分类及其意图:

  1. 策略模式(Strategy Pattern)

    • 意图:定义一系列算法,将它们封装起来,并使它们可以相互替换。策略模式使得算法可以独立于使用它的客户端而变化。
  2. 观察者模式(Observer Pattern)

    • 意图:定义对象间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会收到通知并自动更新。
  3. 责任链模式(Chain of Responsibility Pattern)

    • 意图:将请求的发送者和接收者解耦,使多个对象都有机会处理请求。将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止。
  4. 命令模式(Command Pattern)

    • 意图:将一个请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化,支持请求的排队、记录日志以及撤销操作。
  5. 状态模式(State Pattern)

    • 意图:允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。
  6. 模板方法模式(Template Method Pattern)

    • 意图:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变算法的结构即可重定义算法的某些特定步骤。
  7. 访问者模式(Visitor Pattern)

    • 意图:表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
  8. 中介者模式(Mediator Pattern)

    • 意图:定义一个中介对象来封装一系列对象之间的交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
  9. 备忘录模式(Memento Pattern)

    • 意图:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后可以将该对象恢复到原先保存的状态。
  10. 迭代器模式(Iterator Pattern)

    • 意图:提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。
  11. 解释器模式(Interpreter Pattern)

    • 意图:给定一个语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。

总结

行为型设计模式的核心是对象之间的交互和职责分配。它们通过定义对象之间的协作方式,使系统更加灵活、可扩展和易于维护。与创建型模式和结构型模式相比,行为型模式更关注对象的行为,而不是对象的创建或结构。通过合理使用行为型模式,可以有效地解决对象之间的通信、状态管理、请求处理等问题,从而提高软件设计的质量。

相关文章:

C++设计模式之行为型模式概述,它们的目的与特点

行为型设计模式需要解决的问题 行为型设计模式主要关注对象之间的责任分配和交互。它们解决的问题包括: 对象之间的通信:如何让对象之间高效地通信,同时保持松耦合。算法的封装与复用:如何将算法或行为封装起来,使其…...

把Huggingface下载的arrow数据集转化为json格式

Arrow2json 使用默认的Huggingface路径 以allenai/tulu-3-sft-mixture数据集为例。 使用load_dataset即可: from datasets import load_dataset# 加载数据集 dataset load_dataset("allenai/tulu-3-sft-mixture")# 指定保存路径 output_dir "~/…...

复习打卡大数据篇——Hadoop YARN

目录 1.什么是yarn 2.yarn的三大角色 3.任务(MR)提交到YARN运行流程 4. 调度器Scheduler 5.YARN HA 高可用 1.什么是yarn YARN(Yet Another Resource Negotiator)是一个资源管…...

fpga系列 HDL:ModelSim显示模拟波形以及十进制格式数值

FPGA中使用数字滤波器时,可通过观察模拟波形更好地查看滤波效果。可以通过ModelSim中的波形格式设置来实现更直观的波形显示。 右键波形->Format-> Analog 效果 不同的数值格式显示:右键波形->Radix-> Decimal 效果 示例代码 ver…...

Linux 基本指令

目录 1.常见指令 1.1 ls指令 1.2 pwd指令 1.3 cd指令 1.4 touch指令 1.5 mkdir指令 1.6 rm和rmdir指令 1.7 man指令 1.8 cp指令 1.9 mv指令 ​编辑 1.10 cat指令 1.11 more指令 1.12 less指令 1.13 head指令 1.14.tail指令 1.15 时间相关的指令 1.16 cal…...

GO语言基础面试题

一、字符串和整型怎么相互转换 1、使用 strconv 包中的函数 FormatInt 、ParseInt 等进行转换 2、转换10进制的整形时,可以使用 strconv.Atoi、strconv.Itoa: Atoi是ParseInt(s, 10, 0) 的简写 Itoa是FormatInt(i, 10) 的简写 3、整形转为字符型时&#…...

要查询 `user` 表中 `we_chat_subscribe` 和 `we_chat_union_id` 列不为空的用户数量

文章目录 1、we_chat_subscribe2、we_chat_union_id 1、we_chat_subscribe 要查询 user 表中 we_chat_subscribe 列不为空的用户数量,你可以使用以下 SQL 查询语句: SELECT COUNT(*) FROM user WHERE we_chat_subscribe IS NOT NULL;解释: …...

小程序基础 —— 10 如何调试小程序代码

如何调试小程序代码 在进行项目开发的时候,不可避免需要进行调试,那么如何调试小程序呢? 打开微信开发者工具后,有一个模拟器,通过模拟器能够实时预览自己写的页面,如下: 在上部工具栏中有一个…...

Vue项目如何设置多个静态文件;如何自定义静态文件目录

Vite实现方案 安装插件 npm i vite-plugin-static-copy在vite.config.ts引入 import { viteStaticCopy } from vite-plugin-static-copy配置 plugins: [viteStaticCopy({targets: [{src: "要设置的静态文件目录的相对路径 相对于vite.config.ts的", dest: ./, // …...

CentOS Stream 9 安装 JDK

安装前检查 java --version注:此时说明已安装过JDK,否则为未安装。如若已安装过JDK可以跳过安装步骤直接使用,或者先卸载已安装的JDK版本重新安装。 安装JDK 官网下载地址:https://www.oracle.com/java/technologies/downloads…...

前端(htmlcss)

前端页面 Web页面 PC端程序页面 移动端APP页面 ... HTML页面 HTML超文本标记页面 超文本:文本,声音,图片,视频,表格,链接 标记:由许多标签组成 HTML页面运行到浏览器上面 vscode便捷插件使用 vs…...

py打包工具

pyinstaller 安装 大佬文档参考 pip install pyinstallerpyinstaller 参数 -i 给应用程序添加图标 -F 只生成一个exe格式的文件 -D 创建一个目录,包含exe文件,但会依赖很多文件(默认选项) -c 有黑窗口 -w 去掉黑窗口pyinstalle…...

华为OD E卷(100分)39-最长子字符串的长度(二)

前言 工作了十几年,从普通的研发工程师一路成长为研发经理、研发总监。临近40岁,本想辞职后换一个相对稳定的工作环境一直干到老, 没想到离职后三个多月了还没找到工作,愁肠百结。为了让自己有点事情做,也算提高一下自己的编程能力…...

Selenium+Java(21):Jenkins发送邮件报错Not sent to the following valid addresses解决方案

问题现象 小月妹妹近期在做RobotFrameWork自动化测试,并且使用Jenkins发送测试邮件的时候,发现报错Not sent to the following valid addresses,明明各个配置项看起来都没有问题,但是一到邮件发送环节,就是发送不出去,而且还不提示太多有用的信息,急的妹妹脸都红了,于…...

JSON结构快捷转XML结构API集成指南

JSON结构快捷转XML结构API集成指南 引言 在当今的软件开发世界中,数据交换格式的选择对于系统的互操作性和效率至关重要。JSON(JavaScript Object Notation)和XML(eXtensible Markup Language)是两种广泛使用的数据表…...

【视觉惯性SLAM:四、相机成像模型】

相机成像模型介绍 相机成像模型是计算机视觉和图像处理中的核心内容,它描述了真实三维世界如何通过相机映射到二维图像平面。相机成像模型通常包括针孔相机的基本成像原理、数学模型,以及在实际应用中如何处理相机的各种畸变现象。 一、针孔相机成像原…...

网络编程:TCP和UDP通信基础

TCP 简易服务器&#xff1a; #include<myhead.h>int main(int argc, const char *argv[]) {int oldfd socket(AF_INET,SOCK_STREAM,0);if(oldfd -1){perror("socket");return -1;}//绑定要绑定的结构体struct sockaddr_in server {.sin_family AF_INET,.…...

声波配网原理及使用python简单的示例

将自定义的信息内容&#xff08;如Wi-Fi配置、数字数据&#xff09;转换为音波是一种音频调制与解调技术&#xff0c;广泛应用于声波配网、数据传输和近场通信中。这项技术的实现涉及将数字信息编码为音频信号&#xff0c;并通过解码还原信息。 实现方法 1. 数字数据编码 将原…...

深度学习任务中的 `ulimit` 设置优化指南

深度学习任务中的 ulimit 设置优化指南 1. 什么是 ulimit&#xff1f;2. 深度学习任务中的关键 ulimit 设置2.1 max locked memory&#xff08;-l&#xff09;2.2 open files&#xff08;-n&#xff09;2.3 core file size&#xff08;-c&#xff09;2.4 stack size&#xff08…...

【学生管理系统】权限管理

目录 6.4 权限管理&#xff08;菜单管理&#xff09; 6.4.1 查询所有&#xff08;含孩子&#xff09; 6.4.2 添加权限 6.4.3 核心3&#xff1a;查询登录用户的权限&#xff0c;并绘制菜单 6.4 权限管理&#xff08;菜单管理&#xff09; 6.4.1 查询所有&#xff08;含孩子…...

Mojo调用Python生态的7种方式,第4种连PyTorch官方文档都没写!——混合编程兼容性白皮书首发

第一章&#xff1a;Mojo与Python混合编程全景概览Mojo 是一种兼具 Python 语法亲和力与系统级性能的现代编程语言&#xff0c;专为 AI 基础设施和高性能计算场景设计。它原生兼容 Python 生态&#xff0c;允许开发者在同一个项目中无缝调用 Python 模块、复用 NumPy/Torch 接口…...

LumiPixel Canvas Quest超现实主义创作:生成融合自然与机械的赛博格人像

LumiPixel Canvas Quest超现实主义创作&#xff1a;生成融合自然与机械的赛博格人像 1. 当AI画笔遇见赛博格幻想 打开LumiPixel Canvas Quest的第一感觉&#xff0c;就像拿到了通往异世界的钥匙。这个擅长超现实题材的AI艺术工具&#xff0c;最近在我们团队内部掀起了一阵&qu…...

别再纠结选哪个了!CAN、串口、蓝牙、TCP,手把手教你根据项目场景选通信协议(附Android实战代码)

通信协议选型实战指南&#xff1a;从车载系统到智能家居的黄金法则 当你在凌晨三点的办公室里盯着四块显示器&#xff0c;面前摆着CAN分析仪、蓝牙嗅探器和串口调试终端时&#xff0c;突然意识到项目deadline就在明天——这种场景对嵌入式开发者来说再熟悉不过了。选择错误的通…...

原神帧率解锁完整指南:5步实现高刷新率游戏体验

原神帧率解锁完整指南&#xff1a;5步实现高刷新率游戏体验 【免费下载链接】genshin-fps-unlock unlocks the 60 fps cap 项目地址: https://gitcode.com/gh_mirrors/ge/genshin-fps-unlock 对于追求流畅游戏体验的《原神》玩家来说&#xff0c;游戏内置的60帧限制常常…...

保姆级教程:用YOLOv8+PyQt5打造你的番茄成熟度检测桌面应用(附完整源码与数据集)

从零构建番茄成熟度检测桌面应用&#xff1a;YOLOv8与PyQt5深度整合实战 在农业智能化浪潮中&#xff0c;计算机视觉技术正逐步改变传统农业生产方式。以番茄种植为例&#xff0c;成熟度判断直接影响采摘效率和经济效益。本文将带您完整实现一个结合YOLOv8目标检测与PyQt5图形界…...

高等数学实战解析:定积分换元法与分部积分法的核心技巧

1. 定积分换元法的实战技巧 第一次接触定积分换元法时&#xff0c;我完全被那些符号变换绕晕了。直到后来在物理实验中遇到一个弹簧振子的能量计算问题&#xff0c;才真正明白这个方法的精妙之处。想象你手里拿着一根橡皮筋&#xff0c;想要测量拉伸它需要的总能量——这就是定…...

别再为Allegro导图发愁了!手把手教你用RATA工具搞定BMP单色图转换(附像素调整避坑指南)

Allegro图片导入难题终极指南&#xff1a;从原理到实战的完整解决方案 在PCB设计领域&#xff0c;Allegro作为行业标杆工具&#xff0c;却有一个让无数工程师头疼的"阿喀琉斯之踵"——图片导入功能。无论是公司Logo、结构示意图还是特殊标识&#xff0c;当我们需要将…...

PP-DocLayoutV3效果惊艳:26类标签全覆盖+多边形框可视化热力图展示

PP-DocLayoutV3效果惊艳&#xff1a;26类标签全覆盖多边形框可视化热力图展示 1. 文档布局分析的新突破 在日常工作中&#xff0c;我们经常需要处理各种文档图像——扫描的合同、拍摄的表格、手写的笔记&#xff0c;甚至是倾斜拍摄的白板内容。传统的文档分析工具往往只能处理…...

如何实现Chaos Mesh全链路国际化:从文档到UI的完整指南

如何实现Chaos Mesh全链路国际化&#xff1a;从文档到UI的完整指南 【免费下载链接】chaos-mesh Chaos Mesh 是一个云原生混沌工程平台&#xff0c;用于测试、故障注入和混沌工程。 * 用于混沌工程、故障注入和流量管理、支持 Prometheus 和 Grafana。 * 有什么特点&#xff1a…...

Cadence实战:从原理图到PCB的完整导入流程解析

1. Cadence设计流程概述 刚接触Cadence的硬件工程师常会遇到一个经典问题&#xff1a;为什么原理图设计得漂漂亮亮&#xff0c;导入PCB时却总出各种幺蛾子&#xff1f;这就像做菜时备好了所有食材&#xff0c;下锅时却发现灶台点不着火。我在带新人时发现&#xff0c;90%的导入…...