概述
在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需在程序运行时指定具体的请求接收者即可,此时,可以使用命令模式来进行设计,使得请求发送者与请求接收者消除彼此之间的耦合,让对象之间的调用关系更加灵活。
命令模式可以对发送者和接收者完全解耦,发送者与接收者之间没有直接引用关系,发送请求的对象只需要知道如何发送请求,而不必知道如何完成请求。这就是命令模式的模式动机。
定义
将一个请求封装为一个对象,从而使我们可用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。命令模式是一种对象行为型模式,其别名为动作(
Action
)模式或事务(Transaction
)模式。
角色
Command:
抽象命令类ConcreteCommand:
具体命令类Invoker:
调用者Receiver:
接收者Client:
客户类
场景
- 想要通过执行操作来参数化对象
- 想要在不同的时间指定,排队和执行请求
- 支持撤消
- 支持日志记录更改,以便在系统崩溃时可以重新应用它们
- 围绕基于原始操作的高级操作构建系统
实现
1 2 3 4 5 6 7 8 9 10 |
//接收者 class Receiver { public: void action() { std::cout << "receiver:execute action" << std::endl; } //... }; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
//抽象命令类 class Command { public: virtual ~Command() {} virtual void execute() = 0; //... protected: Command() {} }; //具体命令类 class ConcreteCommand : public Command { public: ConcreteCommand(Receiver * r) : receiver(r) {} ~ConcreteCommand() { if (receiver) delete receiver; } void execute() { receiver->action(); } private: Receiver * receiver; //... }; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
//调用者 class Invoker { public: void set(Command * c) { command = c; } void confirm() { if (command) { command->execute(); } } //... private: Command * command; //... }; |
1 2 3 4 5 6 7 8 9 10 |
auto main()->int { ConcreteCommand command(new Receiver()); Invoker invoker; invoker.set(&command); invoker.confirm(); return 0; } |
本文为原创文章,版权归Aet所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ Linux_命令大全 文件传输03/16
- ♥ Linux_命令大全 压缩备份03/16
- ♥ Linux_ 命令大全 系统设置03/16
- ♥ 行为型:策略模式09/07
- ♥ 创建型:抽象工厂模式08/26
- ♥ 架构模式:MVC模式07/27