#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
{
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();
/*
Barbecuer *boy=new Barbecuer();
Command *bm1=new BakeMuttonCommand(boy);
Command *bm2=new BakeMuttonCommand(boy);
Command *bc1=new BakeChikenWingCommand(boy);
Waiter *girl=new Waiter();
girl->setOrder(bm1);
girl->notify();
girl->setOrder(bm2);
girl->notify();
girl->setOrder(bc1);
girl->notify();
*/
return 0;
}
GOOD:一、建立命令队列;二、可以将命令记入日志;三、接收请求的一方可以拒绝;四、添加一个新命令类不影响其它类;命令模式把请求一个操作的对象与知道怎么操行一个操作的对象分开。