1. 程式人生 > >設計模式(十九)命令模式

設計模式(十九)命令模式

(十九)命令模式

將一個請求封裝為一個物件,從而使你可用不同的請求對客戶進行引數化;對請求排隊或記錄請求日誌,以及支援可撤銷的操作。

優點:

第一,能較容易地設計一個命令佇列;

第二,在需要的情況下,可以較容易地將命令記入日誌;

第三,允許接受請求的一方決定是否要否決請求;

第四,可以容易地實現對請求的撤銷和重做;

第五,由於加進新的具體命令類不影響其他的類,因此增加新的具體命令類很容易。

命令模式把請求一個操作的物件與知道怎麼執行一個操作的物件分隔開。


#include <iostream>
#include <string>
#include <vector>
using namespace std;

//烤肉師傅
class Barbucer
{
public:
	void MakeMutton()
	{
		cout<<"烤羊肉"<<endl;
	}
	void MakeChickenWing()
	{
		cout<<"烤雞翅膀"<<endl;
	}
};

//抽象命令類
class Command
{
protected:
	Barbucer* receiver;
public:
	Command(Barbucer* temp)
	{
		receiver = temp;
	}
	virtual void ExecuteCmd()=0;
};

//烤羊肉命令
class BakeMuttonCmd : public Command
{
public:
	BakeMuttonCmd(Barbucer* temp) : Command(temp){}
	virtual void ExecuteCmd()
	{
		receiver->MakeMutton();
	}
};

//烤雞翅
class ChickenWingCmd : public Command
{
public:
	ChickenWingCmd(Barbucer* temp) : Command(temp){}

	virtual void ExecuteCmd()
	{
		receiver->MakeChickenWing();
	}
};

//服務員類
class Waiter
{
protected:
	vector<Command*> m_commandList;
public:
	void SetCmd(Command* temp)
	{
		m_commandList.push_back(temp);
		cout<<"增加定單"<<endl;
	}

	//通知執行
	void Notify()
	{
		vector<Command*>::iterator p=m_commandList.begin();
		while(p!=m_commandList.end())
		{
			(*p)->ExecuteCmd();
			p++;
		}
	}
};

//客戶端
int main()
{
	//店裡新增烤肉師傅、選單、服務員等顧客
	Barbucer* barbucer=new Barbucer();
	Command* cmd= new BakeMuttonCmd(barbucer);
	Command* cmd2=new ChickenWingCmd(barbucer);
	Waiter* girl = new Waiter();
    //點菜
	girl->SetCmd(cmd);
	girl->SetCmd(cmd2);
    //服務員通知
	girl->Notify();
	return 0;
}