C++设计模式——命令模式
命令模式:将一个请求封装为一个对象....从而使得你可用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及支持可撤销的操作
代码:
#include <iostream> using namespace std; //Receiver类 知道如何实施与执行一个与请求相关的操作,任何类都可能作为一个接收者 class Receiver { public: void action() { cout << "请求执行!" << endl; } }; //Command类,用来声明执行操作的接口 class Command { protected: Receiver* receiver; public: Command(Receiver* receiver):receiver(receiver){} virtual ~Command() {}; virtual void Execute() = 0;//抽象执行命令接口 }; //ConcreteCommand类 将一个接收者对象绑定于一个动作 调用接收者相应的操作 以实现Execute class ConcreteCommand :public Command { public: ConcreteCommand(Receiver* receiver):Command(receiver) { } virtual void Execute() { receiver->action(); } }; //Invoker类,要求该命令执行这个请求 class Invoker { private: Command* command; public: void SetCommand(Command* command) { this->command = command; } void ExecuteCommand() { return command->Execute(); } }; int main() { Receiver* r = new Receiver(); Command* c = new ConcreteCommand(r); Invoker* i = new Invoker(); i->SetCommand(c); i->ExecuteCommand(); delete i; i = nullptr; delete c; c = nullptr; delete r; r = nullptr; system("pause"); return 0; }
优点
命令模式的优点
- 它能较容易的设计一个命令队列;
- 在需要的情况下,可以较容易的将命令计入日志;
- 允许接收请求的一方决定是否要否决请求;
- 可以容易的实现对请求的撤销和重做;
- 由于加进新的具体命令类不影响其他的类,因此增加新的具体命令类很容易;
- 把请求一个操作的对象与知道怎么执行一个操作的对象分隔开;
缺点
模式的缺点
如果命令很多,Command类会很多,增加系统复杂性。