您的位置:首页 > 其它

命令模式(行为变化)

2017-03-21 15:18 288 查看
#include <iostream>
#include <string>
#include <list>
//命令模式:命令模式把一个请求或者操作封装到一个对象中。
//命令模式把发出命令的责任和执行命令的责任分割开,委派给不同的对象。
//命令模式允许请求的一方和发送的一方独立开来,
//使得请求的一方不必知道接收请求的一方的接口,
//更不必知道请求是怎么被接收,
//以及操作是否执行,何时被执行以及是怎么被执行的。
//系统支持命令的撤消。
using namespace std;

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();
}
};

class Waiter2   //gei多个对象下达命令
{
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 main1232131231()
{

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: