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

news2025/1/9 0:08:30

简介

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

描述

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

原理

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

  • 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 的相应方法。

结论

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

应用场景

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1068292.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

WIN11右键菜单更改为WIN7风格

1.按键盘上的 Win R 组合键&#xff0c;打开运行&#xff0c;输入 regedit 命令&#xff0c;按确定或回车&#xff0c;打开注册表编辑器&#xff1b; 2.注册表编辑器窗口中&#xff0c;依次展开到以下路径&#xff1a; HKEY_CURRENT_USER\Software\Classes\CLSID\ 3.左侧定位…

ICE综述

ICE综述 ICE(Internet Communications Engine)是ZeroC提供的一款高性能的中间件&#xff0c;基于ICE可以实现电信级的解决方案。在设计网站架构的时候可以使用ICE实现对网站应用的基础对象操作&#xff0c;将基础对象操作和数据库操作封装在这一层&#xff0c;在业务逻辑层以及…

notepad++ 如何去除换行

选中下方的“扩展” “查找目标”输入&#xff1a;\r\n&#xff0c;替换为:空白 最后全部替换。

钡铼DLT645和IEC104转Modbus协议网关BL120DT:构建智能电力网的关键角色

在电力行业中&#xff0c;DLT645和IEC104转Modbus协议网关已成为重要的通信工具&#xff0c;用于将电力设备的数据和状态信息转换为Modbus协议&#xff0c;以便于远程监控和管理。以下是关于钡铼DLT645和IEC104转Modbus协议网关BL120DT在电力行业应用的案例介绍。 某电力公司需…

记一次地市hw从供应商-目标站-百万信息泄露

起因&#xff1a;某市hw、给了某医院的资产&#xff0c;根据前期进行的信息收集就开始打&#xff0c;奈何目标单位资产太少&#xff0c;唯有一个IP资产稍微多一点点&#xff0c;登录框就两个&#xff0c;屡次尝试弱口令、未授权等均失败。 事件型-通用性-反编译jar-Naocs-后台-…

node-red opc-ua节点操作

node-red opc-ua节点操作 一、使用OPC UA客户端工具Softing OPC Client读写OPC节点数据二、 NodeRed通过OPC UA读取数据并写入mysql三、NodeRed订阅opcua数据&#xff0c;并通过mqtt发布 一、使用OPC UA客户端工具Softing OPC Client读写OPC节点数据 使用OPC UA客户端工具Soft…

超级扫描-专业、快速、安全的二维码和条形码工

官网下载地址&#xff1a; 安果移动 视频介绍&#xff1a;超级扫描-专业、快速、安全的二维码和条形码工具_哔哩哔哩_bilibili 在今天的数字化时代&#xff0c;无论您身处哪里&#xff0c;二维码和条形码无处不在。从商店的货架到在线广告&#xff0c;从名片到活动海报 &…

长江存储YMTC 232L QLC量产,低调上架

有粉丝朋友提醒小编&#xff0c;反馈长江存储232L QLC已经量产&#xff0c;并已经开始售卖了。小编一搜&#xff0c;还真是&#xff0c;“当季新品”。 技术规格信息显示&#xff0c;来自长江存储原厂QLC颗粒。 评论区有用户反馈确认是232层的QLC SSD。 但是&#xff0c;有个奇…

Delphi编程:pagecontrol组件的tab字体变大

1、将pagecontrol组件属性中的font的字体变成四号。 2、将tabsheet1属性中的font的字体设置成八号。 结果如下&#xff1a;

Excel插件:StatPlus Pro 7.7.0 Crack

Windows 版 StatPlus 借助 StatPlus&#xff0c;人们可以获得一套强大的统计工具和图形分析方法&#xff0c;可以通过简单直观的界面轻松访问。StatPlus 的可能应用范围几乎是无限的 - 社会学、金融分析、生物统计学、经济学、保险业、医疗保健和临床研究 - 仅举几个该程序已被…

8、Docker数据卷与数据卷容器

一、数据卷(Data Volumes) 为了很好的实现数据保存和数据共享&#xff0c;Docker提出了Volume这个概念&#xff0c;简单的说就是绕过默认的联合文件系统&#xff0c;而以正常的文件或者目录的形式存在于宿主机上。又被称作数据卷。 数据卷 是一个可供一个或多个容器使用的特殊目…

分分钟搞定MAC丝滑切换node版本,升级node

需求描述 在日常工作中&#xff0c;我们经常会遇到不同项目的依赖需要不同的node版本来运行&#xff0c;这个时候就需要切换node版本啦~~ 如何切换 用node.js的多版本管理器 n 来解决问题 查看node所有版本 npm view node versions 查看当前node版本 node -v安装n模块: …

氟化钡镜片

氟化钡晶体具有良好的光学透过性能&#xff0c;在0.15μm-14.5μm的光谱范围内&#xff0c;可以用作紫外和红外光学窗口。同时&#xff0c;又具有优良的闪烁性能&#xff0c;成为高能物理与核物理、核医学等领域中重要的晶体材料。 特此记录 anlog 2023年10月7日

SpringBoot解决LocalDateTime返回数据为数组问题

现象&#xff1a; 在SpringBoot项目中&#xff0c;接口返回的数据出现LocalDateTime对象被转换成了数组 原因分析&#xff1a; 默认序列化情况下会使用SerializationFeature.WRITE_DATES_AS_TIMESTAMPS。使用这个解析时就会打印出数组。 解决方法&#xff1a; 在配置类中…

什么是原型链(prototype chain)?如何实现继承?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

Windows 10 也能安装Kafka?这篇教程让你轻松掌握!

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是尘缘&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f449;点击这里&#xff0c;就可以查看我的主页啦&#xff01;&#x1f447;&#x…

英特尔® NUC迷你电脑设置带电自启

连接电源后英特尔 NUC迷你电脑可以自动启动吗&#xff1f; (intel.cn) 想死的风还是吹到了公司 | &#x1f468;‍✈️喂&#xff0c;劳动仲裁吗&#xff1f;这里有人强迫猫咪打工&#xff01;&#x1f63f;

苹果ios系统几种开发者账号区别是什么?注册条件和作用以及内部测试人数哪里不一样?怎么选择开发者账号?

苹果ios系统几种开发者账号区别是什么&#xff1f;注册条件和作用以及内部测试人数哪里不一样&#xff1f;怎么选择开发者账号&#xff1f; 苹果有几种开发者账号区别是什么&#xff1f;&#xff1f;注册条件和作用以及内部测试人数哪里不一样&#xff1f;作为开发者我要怎么选…

美元加息已濒精神错乱

「你可以一时欺骗所有人&#xff0c;也可以永远欺骗某些人&#xff0c;但不可能永远欺骗所有人。」—— 亚伯拉罕林肯&#xff0c;美国第16任总统 隔夜美元资本市场上演了极为滑稽的一幕。 UTC时间12:30&#xff08;北京时间晚8点半&#xff09;&#xff0c;美劳工统计局&#…

信号量机制之整型信号量,记录型信号量

1.信号量机制 用户进程可以通过使用操作系统提供的一对原语来对信号量进行操作&#xff0c;从而很方便的实现了进程互斥、进程同步。 1.信号量 信号量其实就是一个变量&#xff08;可以是一个整数&#xff0c;也可以是更复杂的记录型变量)&#xff0c;可以用一个信号量来表示…