一、原理讲解

别名动作(action),事务(transaction)。

1.1意图

将一个请求封装为一个对象,从而使我们可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。

1.2应用场景

  • 抽象出待执行的动作以参数化某对象;
  • 在不同的时刻指定、排列和执行请求;(比如跨进程传递命令对象)
  • 支持取消操作;
  • 支持修改日志,当系统奔溃时这些修改可被重做一次;
  • 用构建在原语操作上的高层操作构造一个系统;

1.3结构图(UML图)

1.4代码实现步骤

a1 定义接口命令类Command,定义一个执行接口函数execute();
a2 定义一个具体命令类ConcreteCommand,重写接口函数execute(),并且定义一个接收者指针Receiver reveiver,该指针reveiver对调用者类Invoker隐藏;
a3 定义一个接收者类Receiver,定义一个动作函数action(),里面实现接收到命令的具体业务逻辑;
a4 定义一个调用者类Invoker,定义一个接口函数executeCommand(),并且定义一个命令指针Command *command,通过该指针执行和处理命令;

二、实现代码

CommandPattern.cpp

#include <iostream>
#include <string>
#include <vector>using namespace std;#define DELETE(pointer) delete (pointer); (pointer)=nullptrclass Receiver
{public:void action() { cout << "Receiver::action()" << endl; }
};class Command
{public:virtual ~Command() {}virtual void execute() = 0; // 执行函数
};class ConcreteCommand : public Command
{Receiver *receiver; // 接收者,只对Command开放,对Invoker隐藏
public:ConcreteCommand(Receiver *receiver) : receiver(receiver){}void execute() override { receiver->action(); }
};class Invoker
{Command *command;
public:Invoker() :command(nullptr) {}bool setCommand(Command *command) {if (command == nullptr)return false;this->command = command;return true;}void executeCommand() {if (command == nullptr)return ;command->execute();}
};void doCommandPattern()
{Receiver *receiver = new Receiver();Command *command = new ConcreteCommand(receiver);Invoker *invoker = new Invoker();if (!invoker->setCommand(command)){cout << "set command err, please repeate operation!" << endl;return;}invoker->executeCommand();DELETE(receiver);DELETE(command);DELETE(invoker);
}

mian.cpp

#include <iostream>extern void doCommandPattern();int main()
{doCommandPattern();system("pause");return 1;
}

三、总结

命令模式主要是将请求封装成对象,从而用不同参数对客户端进行参数化。实现的主要思路是命令类做执行操作,接收者类做具体动作action,调用者类调用命令类指针实现具体命令功能流程。

3.1相关模式

  • Composite可用来实现宏命令;
  • Memento可用来保持某个状态,命令用这一状态来取消它的效果;

四、参考内容

命令模式C++实现
Command Pattern – 命令模式原理及实现(C++)
设计模式–命令模式C++实现
C++设计模式—命令模式
陈建忠设计模式(参考:哔哩哔哩C++设计模式!!!)
Erich Gamma,Richard Helm.《设计模式 可复用面向对象软件的基础》[M].机械工业出版社,2019:

C++设计模式——命令模式(command pattern)相关推荐

  1. 设计模式:命令模式(Command Pattern)

    命令模式(Command Pattern): 在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接受者是谁,也不知道请求的操作是哪个. 我们只需在程序运行时指定具体的请求接受者即可,此时 ...

  2. 设计模式 - 命令模式(command pattern) 撤销(undo) 具体解释

    命令模式(command pattern) 撤销(undo) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 參考命令模式: http://blog.cs ...

  3. 解读设计模式----命令模式(Command Pattern)

    ***本文与作者原文有一定的偏差,其中加入了一部分是个人看法,详细请查看作者原文.*** 原文连接http://www.dofactory.com/Patterns/PatternCommand.as ...

  4. 乐在其中设计模式(C#) - 命令模式(Command Pattern)

    原文:乐在其中设计模式(C#) - 命令模式(Command Pattern) [索引页] [源码下载] 乐在其中设计模式(C#) - 命令模式(Command Pattern) 作者:webabcd ...

  5. 设计模式系列3-----C++实现命令模式(Command Pattern)

    什么是命令模式? GoF的书的定义为:"Command pattern encapsulate request as an object, thereby letting you param ...

  6. C++设计模式--命令模式(Command)

    概述 命令模式的结构很简单,但是对于消除代码间的耦合却有着重要的影响.命令模式就是一个函数对象:一个作为对象的函数.通过将函数封装为对象,就能够以参数的形式将其传递给其他函数或者对象,告诉它们在旅行请 ...

  7. 32命令模式(Command Pattern)

    耦合与变化:     耦合是软件不能抵御变化灾难的根本性原因.不仅实体对象与实体对象之间存在耦合关系,实体对象与行为操作之间也存在耦合关系.                               ...

  8. 命令模式(Command pattern)及代码实现

    模式定义: 将客户端的请求封装成一个对象(这个对象就是 命令对象),使请求的发送者 和请求的接收者 进行 责任分离解耦, 这样 两者只通过 命令进行交互;发送者 不关心 请求的具体实现细节, 接收者 ...

  9. Java设计模式-命令模式Command

    定义 将来自客户端的请求传入一个对象,从而使你可用不同的请求对客户进行参数化.用于"行为请求者"与"行为实现者"解耦,可实现二者之间的松耦合,以便适应变化.分离 ...

  10. 趣谈设计模式 | 命令模式(Command):将命令封装为对象

    文章目录 案例:智能遥控 命令模式 应用场景 队列请求 日志系统 总结 完整代码与文档 命令模式的应用场景较少,且不易理解,因此我也不好举例,所以下面的描述可能会存在一些问题,请见谅 案例:智能遥控 ...

最新文章

  1. 斯坦福前校长John Hennessy、张亚勤等一众大佬云集,共探最前沿技术 | CNCC2020
  2. Tensorflow学习: 乘法demo
  3. SpringCloud 微服务 (十) 消息队列MQ 基础
  4. 快来看看Google出品的Protocol Buffer,别仅仅会用Json和XML了
  5. Jetty在win10上的配置,IDEA中配置Jetty,Maven中配置Jetty插件,Eclipse中配置Jetty插件及其使用,通过java代码内嵌Jetty Server
  6. java只有高跟很高_女明星们为了合影不输,练就踩高跷本领,鞋跟一个比一个高!...
  7. python的sys.path
  8. pat 乙级 1020 月饼(C++实现)
  9. Android项目实战(二十二):启动另一个APP or 重启本APP
  10. linux 服务器鼠标右键失灵_【华鹏客服维修部】系统重置后,键盘失灵怎么办?...
  11. 中科院计算机所网络安全,中科院着力培养网络空间安全人才
  12. 一、操作系统的基本概念
  13. python图像物体的自动标注_python中matplotlib实现随鼠标滑动自动标注代码实例
  14. java 原子量_Java多线程-新特征-原子量
  15. 低功耗广域网络和ISM频段:物联网的里程碑还是公地悲剧?
  16. 大数据流处理的一致性问题与lambda架构优缺点
  17. 联想Y700原厂3165AC更换AX200无线网卡【彪悍的小Y】本机真实验证!!!!
  18. 剖析Unreal Engine超真实人类的渲染技术Part 3 - 毛发渲染及其它
  19. hpux oracle INS-06006 PRVF-7546
  20. 如何办理股票开户手续

热门文章

  1. 高校计算机科学技术排名出炉,高校计算机科学技术排名出炉,上交大“无缘”A+,吉大表现亮眼...
  2. 笑口常开 (Joke)
  3. scratch练习之渣男
  4. 孟岩:JPMCoin 与 Schneier 教授的“区块链无用论”
  5. 【转载】关于Opencv里SIFT和SURF是有专利算法的说明
  6. pytorch yolov5的输入图像尺寸为指定尺寸
  7. 【平面设计作品】 为热爱做设计,也是我的热爱
  8. php修改音频文件_php如何实现音频格式转换
  9. python 切割和拼接图片
  10. 【python3】urlparse和urlsplit的使用与两者的区别