【设计模式】烤羊肉串引来的思考 --- 命令模式
一,概述
定义:命令模式将一个请求或者操作封装到一个命令对象中。允许系统使用不同的请求将客户端参数化,对请求排队或者记录请求日志,提供命令的撤销,恢复能力
优点:
1 命令模式使新的命令很容易被加入
2 允许接受请求方否决请求
3 可较容易地设计一个命令队列
4 可以实现对请求的Undo,Redo
5 可以将命令计入日志
二,示例
两个人 去吃烧烤,先路过一个烧烤摊,人多管理比较混乱,命令请求者跟命令实施者“紧耦合”。
人太对,没吃,然后去烧烤店,遇到了经典的命令模式:服务生负责记录命令,传递命令。厨师负责执行命令。顾客则发出命令
1)烧烤摊代码
#include <iostream>using namespace std; class Receiver//执行命令类 { public: void Action() { cout<<"执行请求!"<<endl; } }; class Command //声明执行操作的接口 { protected: Receiver *receiver;public:Command(Receiver *receiver) { this->receiver = receiver; } virtual void Execute()=0;}; class Invoker//要求该命令执行这个请求 { private: Command *command; public: void SetCommand(Command *command) { this->command = command; } void ExecuteCommand() { command->Execute(); }}; class ConcreteCommand :public Command //将一个接收者对象绑定于一个动作 {public:ConcreteCommand(Receiver *receiver):Command(receiver) { }void Execute() //实现命令接口 { receiver->Action(); }}; int main(){Receiver *r = new Receiver();//命令的真正执行类 (后台厨师) Command *c = new ConcreteCommand(r);//将命令绑定到 命令执行者 (顾客) Invoker *i = new Invoker();//要求命令执行者执行命令(记账单的小生) // Set and execute command i->SetCommand(c);i->ExecuteCommand();system("pause"); }