命令模式(Command Pattern):种数据驱动的设计模式。请求以命令的形式包裹在对象中,将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化。
命令模式
概要分析:
实现了发送者和接收者的完全解耦,
1:可以定义一个命令基类,统一接口,供不同的子类处理不同的命令,以及提供统一接口调用。
2:可以定义一个命令的管理类,根据不同的输入内容,构造不同的具体类,调用执行单个命令。
也可以管理一系列的命令,统一一次执行。
定义命令类,存储命令,定义命令的行为==》基类的方式,保存不同的动作
命令的执行者类,
命令的管理者: 存储命令,执行命令==》真正调度
适用场景:
系统需要将请求调用者和请求接收者解耦,使得调用者和接收者不直接交互。
系统需要在不同的时间指定请求、将请求排队和执行请求。
系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作。
系统需要将一组操作组合在一起,即支持宏命令
源码Demo:
简单的命令模式,可以再加一个管理类,根据不同的入参构造不同的子类,使用更方便。
/**************************************************************************************************************** 命令模式: 说白了就是通过中间人专门去管理这个命令,将这个中间人称为管理命令类,由这个中间人完成指令的发送动作 适用于: 是将一个请求封装为一个对象,从而使你可用不同的请求对客户端进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。 实现方法: 创建命令: 内部构造使用对象注入技术,完成对象调用的绑架 + executecommand接口定义 不同的命令中完成命令的执行者函数 (executecommand重写)+ executecommand(去调用具体执行者的函数) *****************************************************************************************************************/ #include<iostream> #include<string> #include<list> using namespace std; class barbecuer //执行指令的类 { public: void bakemutton(){ cout << "烤羊肉串" << endl; } void bakechickenwing(){ cout << "烤鸡翅" << endl; } }; class Command //命令基类,既包含了命令基类的赋值,也定义了相关操作的接口 { protected://命令类很关键的一步是,告诉大家谁去接受这个指令 barbecuer *receiver;//类的包含 public: Command(barbecuer*receiver) //命令类很关键的一步是,告诉大家谁去接受这个指令 { this->receiver = receiver; } virtual void executecommand() = 0; }; //不同的命令执行1 class bakermuttoncommand :public Command //命令传送者 { public: bakermuttoncommand(barbecuer*receiver) :Command(receiver){} void executecommand(){ receiver->bakemutton(); }//执行烤羊肉串 }; //不同的命令执行2 class bakechikenwingcommand :public Command //命令传送者 { public: bakechikenwingcommand(barbecuer*receiver) :Command(receiver){} void executecommand(){ receiver->bakechickenwing(); }//执行烤鸡翅 }; class waiter //服务员单一,一次只能给一个对象下达指令 { private: Command *command; public: void setorder(Command*command) //对象注入技术,对象的赋值 { this->command = command; } void notify(){ command->executecommand(); } }; //这个类对单一服务员的时候,可有可无。只是为了说明下面的超级服务员做铺垫 class waiter2 //超级服务员,通过list可以给多个对象下达命令进行操作 { private: list<Command*>orders; public: void setorder(Command*command){ orders.push_back(command); } void cancelorder(Command *command){} void notify() { list<Command*>::iterator iter = orders.begin(); while (iter != orders.end()) { (*iter)->executecommand(); iter++; } } }; int main() { barbecuer *boy = new barbecuer;//创建一个执行动作的对象 Command *bm1 = new bakermuttoncommand(boy);//来一个命令创建一次,传送一次命令 //在bakermuttoncommand里面完成对executecommand的操作 //命令类,在基类中完成命令的执行者赋值(使用初始化列表) bm1->executecommand(); Command *bm2 = new bakermuttoncommand(boy); Command *bc1 = new bakechikenwingcommand(boy); waiter2 *girl = new waiter2();//使用超级服务员,去管理这些个命令 girl->setorder(bm1); girl->setorder(bm2); girl->setorder(bc1); girl->notify(); // system("pause"); delete boy; delete bm2; delete bm1; delete bc1; delete girl; return 0; }