命令模式:將來自客戶端的命令請求封裝成對象。
在客戶端和提供服務的服務端增加了一層中間層。 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;
}