博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式(18) - Command命令模式
阅读量:4070 次
发布时间:2019-05-25

本文共 1398 字,大约阅读时间需要 4 分钟。

目录


1.意图

  将一个请求封装成为一个对象,因而使得我们可以用不同的请求,来参数化其它的对象。将请求插入队列或记录请求日志,以及支持可撤销的操作。

2.UML类图

 

  

 

3.GOF角色说明

Command:声明执行操作的接口。

ConcreteCommand:将一个接收者对象绑定于一个动作;调用接收者相应的操作,以实现Execute。

Invoker:要求该命令执行这个请求。

Receiver:知道如何实施与执行一个请求相关的操作。任何类都可能作为一个接收者。

Client:创建一个具体命令对象并设定它的接收者。

4.代码实现  

#include
using namespace std;//命令接口class Command{public: virtual void execute() = 0;};//接收者class AutoDoor{public: void open() { cout << "AutoDoor is opening" << endl; } void close() { cout << "AutoDoor is closing" << endl; }};//执行开门的命令类class OpenCommand : public Command{public: explicit OpenCommand(AutoDoor *door) : _door(door) {} void execute() { _door->open(); }private: AutoDoor *_door;};//执行关门的命令类class CloseCommand : public Command{public: explicit CloseCommand(AutoDoor *door) : _door(door) {} void execute() { _door->close(); }private: AutoDoor *_door;};//保存具体的命令对象class RemoteControl{public: void setCommand(Command *cmd) { _cmd = cmd; } void buttonPressed() { _cmd->execute(); }private: Command *_cmd;};//客户int main(){ //接收者 AutoDoor *door = new AutoDoor; // 具体的命令对象 OpenCommand *opencmd = new OpenCommand(door); CloseCommand *closecmd = new CloseCommand(door); //触发者对象 RemoteControl *ctrl = new RemoteControl; ctrl->setCommand(opencmd); ctrl->buttonPressed(); ctrl->setCommand(closecmd); ctrl->buttonPressed(); delete door, opencmd, closecmd, ctrl; return 0;}

运行结果为:

AutoDoor is opening
AutoDoor is closing

你可能感兴趣的文章
【数据结构周周练】008 二叉树的链式创建及测试
查看>>
《软件体系结构》 第九章 软件体系结构评估
查看>>
《软件体系结构》 第十章 软件产品线体系结构
查看>>
《软件过程管理》 第六章 软件过程的项目管理
查看>>
《软件过程管理》 第九章 软件过程的评估和改进
查看>>
《软件过程管理》 第八章 软件过程集成管理
查看>>
分治法 动态规划法 贪心法 回溯法 小结
查看>>
《软件体系结构》 练习题
查看>>
《数据库系统概论》 第一章 绪论
查看>>
《数据库系统概论》 第二章 关系数据库
查看>>
《数据库系统概论》 第三章 关系数据库标准语言SQL
查看>>
SQL语句(二)查询语句
查看>>
SQL语句(六) 自主存取控制
查看>>
《计算机网络》第五章 运输层 ——TCP和UDP 可靠传输原理 TCP流量控制 拥塞控制 连接管理
查看>>
堆排序完整版,含注释
查看>>
二叉树深度优先遍历和广度优先遍历
查看>>
生产者消费者模型,循环队列实现
查看>>
PostgreSQL代码分析,查询优化部分,process_duplicate_ors
查看>>
PostgreSQL代码分析,查询优化部分,canonicalize_qual
查看>>
PostgreSQL代码分析,查询优化部分,pull_ands()和pull_ors()
查看>>