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

【C++设计模式之命令模式:行为型】分析及示例

简介

命令模式是一种行为型设计模式,它将请求封装成一个对象,从而使不同的请求可以被参数化、队列化或记录化。这种模式允许请求的发送者和接收者进行解耦,同时提供更高的灵活性和可扩展性。

描述

命令模式的核心思想是通过命令对象来封装请求。命令对象包含了执行请求的接收者和相应的动作。客户端通过将命令对象传递给调用者来触发请求的执行。

原理

命令模式包含以下几个关键角色:

  • Command(命令):定义了命令的接口,声明了执行命令的方法。
  • ConcreteCommand(具体命令):实现了Command接口,持有接收者对象,并实现具体的命令操作。
  • Receiver(接收者):负责执行具体命令的对象。
  • Invoker(调用者):有命令对象,调用命令来执行请求。

类图

在这里插入图片描述

其中,Invoker是调用者角色,要求该命令执行这个请求;
Command是命令角色,需要执行的所有命令都在这里声明,可以是接口或抽象类;
Receiver是接收者角色,知道如何实施与执行一个请求相关的操作,任何类都可能作为一个接收者;
ConcreteCommand将一个接收者对象绑定与一个动作,调用接收者相应的操作,以实现Execute。

示例

假设有一个遥控器类 RemoteControl,可以通过按下不同的按钮来执行不同的操作,比如打开电视、关闭电视、调高音量等。我们可以使用命令模式来实现该遥控器:

#include <iostream>// Command(命令)
class Command {
public:virtual void execute() = 0;
};// Receiver(接收者)
class TV {
public:void turnOn() {std::cout << "电视已打开" << std::endl;}void turnOff() {std::cout << "电视已关闭" << std::endl;}void adjustVolume(int volume) {std::cout << "音量已调整为:" << volume << std::endl;}
};// ConcreteCommand(具体命令)
class TurnOnCommand : public Command {
private:TV* tv;
public:TurnOnCommand(TV* tv) : tv(tv) {}void execute() {tv->turnOn();}
};class TurnOffCommand : public Command {
private:TV* tv;
public:TurnOffCommand(TV* tv) : tv(tv) {}void execute() {tv->turnOff();}
};class AdjustVolumeCommand : public Command {
private:TV* tv;int volume;
public:AdjustVolumeCommand(TV* tv, int volume) : tv(tv), volume(volume) {}void execute() {tv->adjustVolume(volume);}
};// Invoker(调用者)
class RemoteControl {
private:Command* command;
public:void setCommand(Command* command) {this->command = command;}void pressButton() {command->execute();}
};int main() {// 创建遥控器和电视对象RemoteControl remoteControl;TV tv;// 创建具体命令对象Command* turnOnCommand = new TurnOnCommand(&tv);Command* turnOffCommand = new TurnOffCommand(&tv);Command* adjustVolumeCommand new AdjustVolumeCommand(&tv 10);// 设置具体命令到遥控器remoteControl.setCommand(turnOnCommand);remoteControl.pressButton(); // 打开电视remoteControl.setCommand(adjustVolumeCommand);remoteControl.pressButton(); // 调高音量remoteControl.setCommand(turnOffCommand);remoteControl.pressButton(); // 关闭电视// 释放资源delete turnOnCommand;delete turnOffCommand;delete adjustVolumeCommand;return 0;
}

输出结果

电视已打开
量已调整为:10
电视已关闭

解释

在上面的示例中,遥控器类 RemoteControl 充当调用者角色,持有命令对象并调用命令的 execute() 方法。具体命令类 TurnOnCommand、TurnOffCommand 和 AdjustVolumeCommand 分别对应打开电视、关闭电视和调整音量这三个具体的命令操作。它们实现了 Command 接口,并在执行 execute() 方法时调用接收者 TV 的相应方法。

结论

命令模式将请求和执行分离开来,提供了一种松耦合的方式,使得请求发送者和接收者可以方便地扩展和变化。同时,命令模式也可以对请求进行队列化、记录化等操作,增加系统的灵活性和可扩展性。

应用场景

  • 需要将具体命令与调用者解耦,使得两者间不直接依赖的情况。
  • 需要对请求进行排队、记录操作历史等场景。
  • 需要支持撤销、重做等功能时。

上述示例实现了一个遥控器控制电视的功能,可以对电视执行打开、关闭和调整音量等操作。通过命令模式,遥控器和具体命令之间实现了解耦,可以很方便地扩展新的命令或修改命令的实现方式。

相关文章:

【C++设计模式之命令模式:行为型】分析及示例

简介 命令模式是一种行为型设计模式&#xff0c;它将请求封装成一个对象&#xff0c;从而使不同的请求可以被参数化、队列化或记录化。这种模式允许请求的发送者和接收者进行解耦&#xff0c;同时提供更高的灵活性和可扩展性。 描述 命令模式的核心思想是通过命令对象来封装…...

二、Excel VBA 简单使用

Excel VBA 从入门到出门一、Excel VBA 是个啥&#xff1f;二、Excel VBA 简单使用 &#x1f44b;Excel VBA 简单使用 ⚽️1. 如何在Excel中手动编写VBA代码⚽️2. 如何在 Excel 中运行 VBA 代码⚽️3. 如何在Excel中记录VBA代码⚽️4. 如何在Excel中编辑录制的VBA代码⚽️5. 如…...

获取url后面的参数

方式一 final String queryString request.getQueryString(); System.out.println(queryString); //解码 System.out.println(URLDecoder.decode(queryString, StandardCharsets.UTF_8));测试&#xff1a; pageSize25&pageNum1&sort%5B%27id%27%5Ddesc&sort%5B%…...

python入门篇07-数据容器(序列 集合 字典,json初识)基础(下)

全文目录,一步到位 1.前言简介1.1 专栏传送门1.1.1 上文传送门 2. python基础使用2.1 序列2.1.1 序列定义2.1.2 序列参数解释2.1.3 列表list切片2.1.4 元组tuple切片2.1.5 字符串str切片 2.2 集合定义2.2.1 set集合-基本语法2.2.2 set集合-添加元素.add()2.2.3 set集合- 移除元…...

阿里云服务器公网带宽价格表“按固定带宽”计费模式

阿里云服务器公网带宽计费模式按固定带宽”计费多少钱1M&#xff1f;地域不同带宽价格不同&#xff0c;北京、杭州、深圳等大陆地域价格是23元/Mbps每月&#xff0c;中国香港1M带宽价格是30元一个月&#xff0c;美国硅谷是30元一个月&#xff0c;日本东京1M带宽是25元一个月&am…...

MTK的充电方案—PMIC充电

MTK目前有三套充电方案&#xff0c;主要如下&#xff1a; &#xff08;1&#xff09;线性充电——linering charge(PMIC充电&#xff09; 充9停1&#xff0c;充电电流不能太大&#xff0c;目前最大能做到1.2A&#xff1b; &#xff08;2&#xff09;switch charge&#xff08…...

【Overload游戏引擎分析】画场景栅格的Shader分析

Overload引擎地址&#xff1a; GitHub - adriengivry/Overload: 3D Game engine with editor 一、栅格绘制基本原理 Overload Editor启动之后&#xff0c;场景视图中有栅格线&#xff0c;这个在很多软件中都有。刚开始我猜测它应该是通过绘制线实现的。阅读代码发现&#xff0…...

智能化物流管理:全国快递物流查询API的角色与优势

前言 当今社会&#xff0c;物流行业已经成为了国民经济的重要组成部分&#xff0c;而快递物流则是物流行业中的一个重要分支。随着信息技术的不断发展&#xff0c;智能化物流管理正逐渐成为快递物流领域的趋势&#xff0c;而全国快递物流查询API作为其中的一部分&#xff0c;在…...

Spring Boot如何配置CORS支持

Spring Boot如何配置CORS支持 CORS&#xff08;跨源资源共享&#xff09;是一种Web浏览器的安全性功能&#xff0c;用于控制网页上的脚本文件从不同的源加载其他网页资源。在开发现代Web应用程序时&#xff0c;通常需要跨域请求不同的资源&#xff0c;如API服务或其他Web应用程…...

Mybatis 拦截器(Mybatis插件原理)

Mybatis为我们提供了拦截器机制用于插件的开发&#xff0c;使用拦截器可以无侵入的开发Mybatis插件&#xff0c;Mybatis允许我们在SQL执行的过程中进行拦截&#xff0c;提供了以下可供拦截的接口&#xff1a; Executor&#xff1a;执行器ParameterHandler&#xff1a;参数处理…...

AXI总线协议基础--几分钟熟悉通道信号和基础架构

目录 一、AXI协议基础 1.1读写通道的基本架构图 1.2猝发操作举例 1.3传输顺序 二、各个通道中的信号描述 2.1全局信号 2.2写地址通道信号 2.3写数据通道信号 2.4写响应通道信号 2.5读地址通道信号 2.6读数据通道 三、通道握手 3.1单一信息传输时的握手过程 3.2不…...

matlab数学建模方法与实践 笔记汇总

matlab数学建模方法与实践 笔记汇总 写在最前面笔记1&#xff1a;快速入门1.导入数据2.数据探索3.多项式拟合4.发布功能5.数据类型6、全部代码 笔记2&#xff1a;数据的准备1.数据的读取与写入excel、txt读图读视频 2.数据预处理缺失值噪声过滤数据归约数据变换 3.数据统计4.数…...

[UE虚幻引擎] DTCopyFile 插件说明 – 使用蓝图拷贝复制文件 (Windows)

本插件可以在虚幻引擎中使用蓝图对系统的其他文件进行拷贝复制操作。 1. 节点说明 Async Copy File ​ 异步复制文件 Param Source File : 要复制的源文件的完整路径。Param Target File : 要复制的目标文件的完整路径。Param Force Copy : 如果为true&#xff0c;则如果目标…...

如何用ChatGPT学或教英文?5个使用ChatGPT的应用场景!

原文&#xff1a;百度安全验证 AI工具ChatGPT的出现大幅改变许多领域的运作方式&#xff0c;就连「学英文」也不例外&#xff01;我发现ChatGPT应用在英语的学习与教学上非常有意思。 究竟ChatGPT如何改变英文学习者(学生)与教学者(老师)呢&#xff1f; 有5个应用场景我感到…...

基于spirngboot人事考勤管理信息系统

一&#xff1a;功能介绍 本系统前端采用vue框架以及Elemnt-UI,后端采用springboot、mysql、redis、mybatis等技术栈。 主要功能有登录、员工考勤、数据统计、薪资管理、权限管理、打卡管理、考勤审核、请假审批、薪资发放、报表统计、文件上传、文件下载、考勤设置、请假设置。…...

QT界面窗口 (widget)的显示和隐藏,关闭

QT界面窗口的显示和隐藏,关闭_qt窗口隐藏关闭按钮_123无敌&#xff0c;就你了的博客-CSDN博客...

这7个AI软件让设计效率飞起,快来收藏 优漫动游

伴随着AI技术的发展&#xff0c;设计师使用AI工具来提高工作效率已成为一种趋势&#xff0c;越来越多的AI工具也出现在市场上。本文收集了市场上7个好用的AI工具推荐给大家&#xff0c;一起来看看吧&#xff01; 这7个AI软件让设计效率飞起&#xff0c;快来收藏 1、即时AI…...

ElasticSearch环境准备

Elasticsearch 是一个基于 Apache Lucene™ 的开源搜索引擎。不仅仅是一个全文搜索引擎&#xff0c;它还是一个分布式的搜索和分析引擎&#xff0c;可扩展并能够实时处理大数据。以下是关于 Elasticsearch 的一些主要特点和说明&#xff1a; 1.实时分析&#xff1a;Elasticsear…...

JAVA练习百题之数组插入元素

题目&#xff1a;有一个已经排好序的数组。现输入一个数&#xff0c;要求按原来的规律将它插入数组中。 程序分析 要将一个数插入已经排好序的数组中&#xff0c;我们可以采用以下步骤&#xff1a; 遍历数组&#xff0c;找到第一个大于待插入数的位置。将待插入数插入到该位…...

C++11常见语法

目录 lambda 表达式 可变模板参数 C11新类的默认函数 包装器 function bind lambda 表达式 lambda 表达式也是可调用对象&#xff0c;在C语言中就有函数指针&#xff0c;但是函数指针比较复杂。 而在C11之前&#xff0c;也有仿函数&#xff0c;使用仿函数&#xff0c;还…...

别再只用scatter了!用Matlab绘制密度散点图,让你的数据分布一目了然(附TheColor配色方案)

突破数据可视化瓶颈&#xff1a;Matlab密度散点图实战指南 当你面对数十万个数据点时&#xff0c;传统的散点图往往会变成一团模糊的噪点&#xff0c;重要分布特征完全被掩盖。这种场景下&#xff0c;密度散点图就像给你的数据装上了X光机&#xff0c;让隐藏的模式和结构清晰可…...

深度学习模型可解释性详解:从原理到实践

深度学习模型可解释性详解&#xff1a;从原理到实践 1. 背景与动机 随着深度学习模型在各个领域的广泛应用&#xff0c;模型的可解释性变得越来越重要。深度学习模型通常被视为"黑盒"&#xff0c;其内部决策过程难以理解&#xff0c;这在医疗、金融、法律等关键领域应…...

硬件工程师成长指南:从理论到实战的完整路径

1. 硬件工程师的成长路线&#xff1a;从理论到实践的完整规划作为一名从业十年的硬件工程师&#xff0c;我见过太多新人一上来就埋头焊板子、调电路&#xff0c;结果浪费大量时间在低水平重复。硬件设计就像下围棋&#xff0c;没有全局思维的人永远只能当个业余爱好者。今天我想…...

视频技术三要素:码率、帧率与分辨率的实战解析

1. 视频三要素的基础认知 第一次接触视频制作时&#xff0c;我被各种专业术语搞得晕头转向。直到有前辈告诉我&#xff1a;"其实只要搞懂码率、帧率和分辨率这三个参数&#xff0c;就能解决80%的视频质量问题。"这句话让我茅塞顿开&#xff0c;今天我就把这些年积累的…...

西门子1200水处理程序全解析

西门子1200水处理程序 包含1200PLC通讯点表&#xff0c;CAD原理图&#xff0c;操作说明。 触摸屏包含了组态画面&#xff0c;操作画面&#xff0c;参数设置画面&#xff0c;报警记录等。 V16以上可以打开最近在搞西门子1200的水处理程序项目&#xff0c;今天来和大家分享一下其…...

UniAD高版本环境实战:CUDA11.6+PyTorch1.12避坑全记录(附完整依赖清单)

UniAD高版本环境实战&#xff1a;CUDA11.6PyTorch1.12避坑全记录&#xff08;附完整依赖清单&#xff09; 当计算机视觉工程师尝试复现前沿论文时&#xff0c;环境配置往往成为第一道门槛。UniAD作为自动驾驶领域的统一大模型&#xff0c;其官方文档推荐的环境配置&#xff08;…...

IDEA插件实战:CodeGeeX4不只是补全代码,这5个隐藏用法让效率翻倍

IDEA插件实战&#xff1a;CodeGeeX4不只是补全代码&#xff0c;这5个隐藏用法让效率翻倍 在JetBrains生态中&#xff0c;AI编程助手早已不是新鲜事物&#xff0c;但大多数开发者对CodeGeeX4的认知仍停留在"智能补全"层面。当我在团队内部做技术分享时&#xff0c;发现…...

Loop窗口管理工具:如何用径向菜单和智能暂存系统提升Mac多任务效率300%

Loop窗口管理工具&#xff1a;如何用径向菜单和智能暂存系统提升Mac多任务效率300% 【免费下载链接】Loop MacOS窗口管理 项目地址: https://gitcode.com/GitHub_Trending/lo/Loop 在当今多任务工作环境中&#xff0c;Mac用户经常面临窗口管理的挑战。每天在多个应用之间…...

自动缝纫机SolidWorks

在自动缝纫机的设计过程中&#xff0c;往往需要处理大量精密零件的协同工作&#xff0c;从送布机构、针杆组件到旋梭系统&#xff0c;每个部件的尺寸精度和装配关系都直接影响设备的运行稳定性和缝纫效果。而SolidWorks作为三维设计工具&#xff0c;在这一过程中扮演着关键角色…...

MATLAB与Zemax交互扩展:从API连接到自动化光学设计

1. MATLAB与Zemax交互扩展的核心价值 光学设计工程师们经常面临一个痛点&#xff1a;在Zemax OpticStudio中完成初步设计后&#xff0c;需要进行大量重复性的参数调整和优化。传统的手动操作不仅效率低下&#xff0c;还容易出错。这就是MATLAB与Zemax交互扩展功能的价值所在——…...