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

7. 命令模式

目录

  • 一、解决的问题
  • 二、设计类图
  • 三、代码实现
    • 3.1 设计类图
    • 3.2 代码实现
  • 四、扩展

一、解决的问题

  • 行为请求者行为实现者解耦,当用户发出命令后,无需关注谁来执行命令。
  • 将命令的发出者和命令的执行者完全隔离开。

二、设计类图

在这里插入图片描述

  • Client:创建具体的命令对象,并且设置命令对象的接收者
  • Invoker:命令传递者,要求命令对象执行请求
  • Command:定义命令的接口
  • ConcreteCommand:命令接口实现对象
  • Receiver:命令接收并执行

三、代码实现

3.1 设计类图

  • 以电视机遥控器作为背景进行,类图如下
    在这里插入图片描述

3.2 代码实现


#include <iostream>class TV
{
private:int currentChannel = 0;public:void changeChannel(int channel){this->currentChannel = channel;}void turnOff(){std::cout << "TV is off." << std::endl;}void turnOn(){std::cout << "TV is on." << std::endl;}
};class Command
{
public:virtual void execute() = 0;
};class CommandOn : public Command
{
private:TV* myTV;
public:CommandOn(TV* tv){myTV = tv;}void execute(){myTV->turnOn();}
};class CommandOff : public Command
{
private:TV* myTV;
public:CommandOff(TV* tv){myTV = tv;}void execute(){myTV->turnOff();}
};class CommandChange : public Command
{
private:TV* myTV;int channel;
public:CommandChange(TV* tv, int channel){myTV = tv;this->channel = channel;}void execute(){std::cout << "Switch Channel to " << channel << std::endl;myTV->changeChannel(channel);}
};class Control
{
private:Command* changChannel;Command* offCommand;Command* onCommand;public:Control(Command* changChannel, Command* off, Command* on){this->changChannel = changChannel;this->offCommand = off;this->onCommand = on;}void changeChannel(){changChannel->execute();}void turnOff(){offCommand->execute();}void turnOn(){onCommand->execute();}
};int main()
{TV* mytv = new TV();Command* on = new CommandOn(mytv);Command* off = new CommandOff(mytv);Command* channel = new CommandChange(mytv, 3);Control* control = new Control(channel, off, on);control->turnOn();control->changeChannel();control->turnOff();return 0;
}

四、扩展

  • 定义一个3对控制器的按钮
  • 分别控制客厅灯、厨房灯和车库门的开关操作
  • 类图如下
    请添加图片描述
  • 运行结果
    在这里插入图片描述
  • 代码部分请参阅 https://gitee.com/piglittle/design_patterns中的 Head_First_Design_Partterns解决方案下的 command_pattern项目
http://www.dtcms.com/a/289115.html

相关文章:

  • Modbus Slave 使用教程:快速搭建模拟从站进行测试与开发
  • Ribbon轮询实现原理
  • Unity笔记——Unity 封装方法指南
  • day24——Java高级技术深度解析:单元测试、反射、注解与动态代理
  • [Python] -项目实战类3- 用Python制作一个记事本应用
  • CVE-2022-41128
  • Python数据处理库与语法总结
  • API获取及调用(以豆包为例实现图像分析)
  • FreeRTOS任务创建与删除
  • 掌握配置文件(三):运用Profile实现多环境配置隔离
  • 三级知识点汇总(详解)【c++】——3
  • 让不符合要求的任何电脑升级Windows11
  • 《通信原理》学习笔记——第五章
  • 开源安全大模型Foundation-Sec 8B的安全实践
  • 分享如何在保证画质的前提下缩小视频体积实用方案
  • 【记某次线上消息积压问题排查及解决方案】
  • 基于Pytorch的人脸识别程序
  • 基于FPGA实现ARINC818
  • Milvus Dify 学习笔记
  • Unity学习笔记(五)——3DRPG游戏(2)
  • DFS 迷宫问题 难度:★★★★☆
  • Python适配器模式详解:让不兼容的接口协同工作
  • CSS中Padding与Margin的区别
  • 机器学习-线性回归
  • 【数据结构】「队列」(顺序队列、链式队列、双端队列)
  • ubuntu24.04安装CUDA和VLLM
  • 企业级安全威胁检测与响应(EDR/XDR)架构设计
  • WireShark抓包分析TCP数据传输过程与内容详解
  • 多目标轨迹优化车道变换规划:自动驾驶轨迹规划新范式:基于Frenet坐标系的车道变换算法全解析
  • Node.js Express keep-alive 超时时间设置