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;
}
运行结果如下: