命令模式:将来自客户端的命令请求封装成对象。
在客户端和提供服务的服务端增加了一层中间层。 invoker
invoker 负责 1:将来自客户端的命令封装成对象(SetCmd);
2:负责调用提供服务的服务端提供的方法,来响应客户端的命令请求
#include <iostream>
#include <vector>
using namespace std;
//铡ㄥ笀绫?鎻愪緵鍝嶅簲锻戒护镄勬柟娉?class Cooker
{
public:
void CookFish()
{
cout<<"cook fish"<<endl;
}
void CookMeat()
{
cout<<"cook meat"<<endl;
}
};
//鿔借薄command 绫?class Command
{
public:
Command(Cooker *cook):m_pCook(cook){}
virtual void ExecuteCmd()= 0;
protected:
Cooker *m_pCook;
};
class CookFishCmd: public Command
{
public:
CookFishCmd(Cooker *cook):Command(cook){}
void ExecuteCmd()
{
m_pCook->CookFish();
}
};
class CookMeatCmd: public Command
{
public:
CookMeatCmd(Cooker *cook):Command(cook){}
void ExecuteCmd()
{
m_pCook->CookMeat();
}
};
class Waiter
{
public:
void SetCmd(Command *cmd);
void Notify();
private:
vector<Command*>vecCmd;
};
void Waiter::SetCmd(Command *cmd)
{
vecCmd.push_back(cmd);
cout<<"add_order"<<endl;
}
void Waiter::Notify()
{
vector<Command*>::iterator iter;
for(iter= vecCmd.begin(); iter != vecCmd.end(); iter++)
{
(*iter)->ExecuteCmd();
}
}
int main()
{
Cooker *cook = new Cooker();
CookFishCmd *cfishCmd = new CookFishCmd(cook);
CookMeatCmd *cmeatCmd = new CookMeatCmd(cook);
Waiter *girl = new Waiter();
girl->SetCmd(cfishCmd);
girl->SetCmd(cmeatCmd);
girl->Notify();
return 0;
}