1命令模式的核心内容是:
A:发命令者,与实际不同的是,发命令者要求了实际由谁做菜,烤肉。
B:有两个级别的服务员,一个级别的服务员每次只收集一个命令;另外一类服务员可以同时收集多条命令,最后通知厨子和Barbecuer
2命令模式的作用:通过命令模式可以模拟到餐馆下单,服务员向厨子发命令的这个场景。
3命令模式具体描述
命令模式:命令模式把一个请求或者操作封装到一个对象中。
命令模式把发出命令的责任和执行命令的责任分割开,委派给不同的对象。
命令模式允许请求的一方和发送的一方独立开来,
使得请求的一方不必知道接收请求的一方的接口,
更不必知道请求是怎么被接收,
以及操作是否执行,何时被执行以及是怎么被执行的。
系统支持命令的撤消。
俺有一个MM家里管得特别严,没法见面,只好借助于她弟弟在我们俩之间传送信息,
她对我有什么指示,就写一张纸条让她弟弟带给我。这不,
她弟弟又传送过来一个COMMAND,为了感谢他,我请他吃了碗杂酱面,
哪知道他说:“我同时给我姐姐三个男朋友送COMMAND,就数你最小气,
才请我吃面。”
4.命令模式类图
5.代码:
#include<iostream>
#include <string>
#include <list>
using namespace std;
//命令模式:命令模式把一个请求或者操作封装到一个对象中。
//命令模式把发出命令的责任和执行命令的责任分割开,委派给不同的对象。
//命令模式允许请求的一方和发送的一方独立开来,
//使得请求的一方不必知道接收请求的一方的接口,
//更不必知道请求是怎么被接收,
//以及操作是否执行,何时被执行以及是怎么被执行的。
//系统支持命令的撤消。
//
//俺有一个MM家里管得特别严,没法见面,只好借助于她弟弟在我们俩之间传送信息,
//她对我有什么指示,就写一张纸条让她弟弟带给我。这不,
//她弟弟又传送过来一个COMMAND,为了感谢他,我请他吃了碗杂酱面,
//哪知道他说:“我同时给我姐姐三个男朋友送COMMAND,就数你最小气,
//才请我吃面。”
//接收者执行命令,这里相当于实际干活的人
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;
};
//相当于命令的特化
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();
}
};
//服务员,这里是当条命令
class Waiter
{
private:
Command *command;
public:
void setOrder(Command *command)
{
this->command = command;
}
void notify()
{
command->executeCommand();
}
};
//gei多个对象下达命令,下多条命令的情况
class Waiter2
{
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 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;
}
运行结果如下: