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

相关文章:

  • 一维数组练题习~
  • 算法题(176):three states
  • windows11环境配置torch-points-kernels库编译安装详细教程
  • 如何优雅解决缓存与数据库的数据一致性问题?
  • 循环黑洞:用Python生成银河系特效图
  • tidyverse-数据可视化 - 图形的分层语法
  • Web开发 04
  • Work SSD基础知识
  • jxORM--编程指南
  • 试用SAP BTP 02:试用SAP HANA Cloud
  • MySQL笔记3
  • Oracle触发器:数据世界的“隐形守护者“
  • Uniapp 纯前端台球计分器开发指南:能否上架微信小程序 打包成APP?
  • Github 贪吃蛇 主页设置
  • 将EXCEL或者CSV转换为键值对形式的Markdown文件
  • 【Python数据采集】Python爬取小红书搜索关键词下面的所有笔记的内容、点赞数量、评论数量等数据,绘制词云图、词频分析、数据分析
  • (LeetCode 面试经典 150 题 ) 1. 两数之和 (哈希表)
  • ps2025下载与安装教程(附安装包) 2025最新版photoshop安装教程
  • 在NLP深层语义分析中,深度学习和机器学习的区别与联系
  • MacBook的ARM架构(M芯片)操作虚拟机的docker拉取镜像问题
  • XSS内容总结
  • 【图文详解】Transformer架构详细解析:多头自注意力机制、qkv计算过程、encoder架构、decoder架构以及mask的意义
  • Logback简单使用
  • WiFiMouseServer手机等作为远程输入
  • 进阶向:基于Python的局域网文件传输工具
  • LeetCode|Day20|9. 回文数|Python刷题笔记
  • 多任务学习AITM算法简介
  • Kafka MQ 控制器 broker
  • 数据结构第二章:线性表之顺序表
  • 【新手向】PyTorch常用Tensor shape变换方法