当前位置: 首页 > 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.xdnf.cn/news/1155313.html

相关文章:

  • 5G NR PDCCH之CRC处理
  • GaussDB 数据库架构师修炼(七) 安全规划
  • 【Docker-Day 7】揭秘 Dockerfile 启动指令:CMD、ENTRYPOINT、ENV、ARG 与 EXPOSE 详解
  • 常用框架知识
  • Python基础-列表
  • 【Lua】大G表
  • 06 51单片机之矩阵键盘
  • 【Kafka】深入理解 Kafka MirrorMaker2 - 实战篇
  • 链表的基本操作
  • 费曼学习法
  • 吴恩达机器学习笔记(3)—线性代数回顾(可选)
  • 嵌入式硬件篇---按键
  • Nginx的location匹配规则
  • Android 项目中如何在执行 assemble 或 Run 前自动执行 clean 操作?
  • Go语言--语法基础6--基本数据类型--map类型
  • Node.js 中基于请求 ID 实现简单队列(即时阻止策略/排队等待策略)
  • 在NLP深层语义分析中,深度学习和机器学习的区别与联系
  • 【数据结构】二维差分数组
  • 技术演进中的开发沉思-40 MFC系列:多线程协作
  • JavaScript平滑滚动与锚点偏移控制的完整指南
  • InfluxDB 核心概念与发展历程全景解读(二)
  • 18.TaskExecutor获取ResourceManagerGateway
  • Unity笔记——Unity 封装方法指南
  • OpenCV 入门知识:图片展示、摄像头捕获、控制鼠标及其 Trackbar(滑动条)生成!
  • QT无边框窗口
  • 2025 年科技革命时刻表:四大关键节点将如何重塑未来?
  • 详解Mysql Order by排序底层原理
  • RK3588 编译 Android 13 镜像方法
  • 用C语言实现控制台应用的按键方向控制
  • Qt的安装和环境配置