13.命令模式
1命令模式的核心內(nèi)容是:
A:發(fā)命令者,與實(shí)際不同的是,發(fā)命令者要求了實(shí)際由誰(shuí)做菜,烤肉。
B:有兩個(gè)級(jí)別的服務(wù)員,一個(gè)級(jí)別的服務(wù)員每次只收集一個(gè)命令;另外一類服務(wù)員可以同時(shí)收集多條命令,最后通知廚子和Barbecuer
2命令模式的作用:通過(guò)命令模式可以模擬到餐館下單,服務(wù)員向廚子發(fā)命令的這個(gè)場(chǎng)景。
3命令模式具體描述
命令模式:命令模式把一個(gè)請(qǐng)求或者操作封裝到一個(gè)對(duì)象中。
命令模式把發(fā)出命令的責(zé)任和執(zhí)行命令的責(zé)任分割開(kāi),委派給不同的對(duì)象。
命令模式允許請(qǐng)求的一方和發(fā)送的一方獨(dú)立開(kāi)來(lái),
使得請(qǐng)求的一方不必知道接收請(qǐng)求的一方的接口,
更不必知道請(qǐng)求是怎么被接收,
以及操作是否執(zhí)行,何時(shí)被執(zhí)行以及是怎么被執(zhí)行的。
系統(tǒng)支持命令的撤消。
?
俺有一個(gè)MM家里管得特別嚴(yán),沒(méi)法見(jiàn)面,只好借助于她弟弟在我們倆之間傳送信息,
她對(duì)我有什么指示,就寫一張紙條讓她弟弟帶給我。這不,
她弟弟又傳送過(guò)來(lái)一個(gè)COMMAND,為了感謝他,我請(qǐng)他吃了碗雜醬面,
哪知道他說(shuō):“我同時(shí)給我姐姐三個(gè)男朋友送COMMAND,就數(shù)你最小氣,
才請(qǐng)我吃面。”
4.命令模式類圖
5.代碼:
#include<iostream>
#include <string>
#include <list>
?
using namespace std;
//命令模式:命令模式把一個(gè)請(qǐng)求或者操作封裝到一個(gè)對(duì)象中。
//命令模式把發(fā)出命令的責(zé)任和執(zhí)行命令的責(zé)任分割開(kāi),委派給不同的對(duì)象。
//命令模式允許請(qǐng)求的一方和發(fā)送的一方獨(dú)立開(kāi)來(lái),
//使得請(qǐng)求的一方不必知道接收請(qǐng)求的一方的接口,
//更不必知道請(qǐng)求是怎么被接收,
//以及操作是否執(zhí)行,何時(shí)被執(zhí)行以及是怎么被執(zhí)行的。
//系統(tǒng)支持命令的撤消。
//
//俺有一個(gè)MM家里管得特別嚴(yán),沒(méi)法見(jiàn)面,只好借助于她弟弟在我們倆之間傳送信息,
//她對(duì)我有什么指示,就寫一張紙條讓她弟弟帶給我。這不,
//她弟弟又傳送過(guò)來(lái)一個(gè)COMMAND,為了感謝他,我請(qǐng)他吃了碗雜醬面,
//哪知道他說(shuō):“我同時(shí)給我姐姐三個(gè)男朋友送COMMAND,就數(shù)你最小氣,
//才請(qǐng)我吃面。”
?
//接收者執(zhí)行命令,這里相當(dāng)于實(shí)際干活的人
class Barbecuer?
{
public:
??? void bakeMutton()
??? {
??????? cout << "烤羊肉串" << endl;
??? }
??? void bakeChickenWing()
??? {
??????? cout << "烤雞翅" << endl;
??? }
};
?
//對(duì)某個(gè)人下達(dá)的命令
class Command?? //命令基類
{
protected:
??? Barbecuer *receiver;//類的包含
public:
??? Command(Barbecuer *receiver)//命令接受
??? {
??????? this->receiver = receiver;
??? }
??? //然后執(zhí)行命令
??? virtual void executeCommand() = 0;
};
?
//相當(dāng)于命令的特化
class BakeMuttonCommand :public Command
{
public:
??? BakeMuttonCommand(Barbecuer *receiver) :Command(receiver)
??? {}
??? void executeCommand()
??? {
??????? receiver->bakeMutton();
??? }
};
?
//命令的特化
class BakeChikenWingCommand :public Command
{
public:
??? BakeChikenWingCommand(Barbecuer *receiver) :Command(receiver)
??? {}
??? void executeCommand()
??? {
??????? receiver->bakeChickenWing();
??? }
};
?
//服務(wù)員,這里是當(dāng)條命令
class Waiter
{
private:
??? Command *command;
public:
??? void setOrder(Command *command)
??? {
??????? this->command = command;
??? }
??? void notify()
??? {
??????? command->executeCommand();
??? }
};
?
//gei多個(gè)對(duì)象下達(dá)命令,下多條命令的情況
class Waiter2?
{
private:
??? list<Command*> orders;
public:
??? //下單
??? void setOrder(Command *command)
??? {
??????? orders.push_back(command);
??? }
??? //取消訂單
??? void cancelOrder(Command *command)
??? {
??? }
??? //發(fā)出通知
??? void notify()
??? {
??????? list<Command*>::iterator iter = orders.begin();
??????? while (iter != orders.end())
??????? {
??????????? (*iter)->executeCommand();
??????????? iter++;
??????? }
??? }
};
?
?
int main()
{
?
??? Barbecuer *boy = new Barbecuer();
??? Command *bm1 = new BakeMuttonCommand(boy);
??? Command *bm2 = new BakeMuttonCommand(boy);
??? Command *bc1 = new BakeChikenWingCommand(boy);
?
??? Waiter2 *girl = new Waiter2();
?
??? girl->setOrder(bm1);
??? girl->setOrder(bm2);
??? girl->setOrder(bc1);
?
??? girl->notify();
?
?
??? cin.get();
?
??? return 0;
}
運(yùn)行結(jié)果如下:
總結(jié)