命令模式(Command):将一个请求封装为一个对象,从而可以用不同的请求对客户进行参数化:对请求排队或记录请求日志,以及支持可撤销的操作。
例子:服务员接受各种订单命令,并可以对订单排队或者撤销,再将订单给厨师执行
UML:
//烤肉串者
class Barbecuer {
public:
void BakeMutton()
{
cout <<"烤肉串" << endl;
}
void BakeChickenWing()
{
cout << "烤鸡翅" << endl;
}
};
//抽象命令
class Command {
protected:
Barbecuer *m_barbecuer; //命令执行者
public:
Command(Barbecuer *barbecuer) :m_barbecuer(barbecuer) {}
virtual void ExcuteCommand() {};
};
//烤肉命令
class BakeMuttonCommand :public Command {
public:
BakeMuttonCommand(Barbecuer *barbecuer) :Command(barbecuer) {}
void ExcuteCommand()
{
m_barbecuer->BakeMutton();
}
};
//烤鸡翅命令
class BakeChickenWingCommand :public Command {
public:
BakeChickenWingCommand(Barbecuer *barbecuer) :Command(barbecuer) {}
void ExcuteCommand()
{
m_barbecuer->BakeChickenWing();
}
};
//服务员
class Waiter {
private:
list<Command*> commandlist; //命令列表
public:
void SetOrder(Command *command) //增加订单
{
if (typeid(*command) == typeid(BakeChickenWingCommand)) //判断命令能否执行
{
cout << "鸡翅没有了,请点其他的" << endl;
}
else
{
commandlist.push_back(command); //加入命令列表
cout << "增加订单" << endl;
}
}
void CancelOrder(Command *command) //取消订单
{
commandlist.remove(command); //删除命令
}
void Notify() //执行所有命令
{
for (auto l : commandlist)
{
l->ExcuteCommand();
}
commandlist.clear(); //清空命令列表
}
};
int main()
{
Barbecuer *boy = new Barbecuer();
Command *bakemuttonCommand1 = new BakeMuttonCommand(boy);
Command *bakemuttonCommand2 = new BakeMuttonCommand(boy);
Command *bakechickenCommand = new BakeChickenWingCommand(boy);
Waiter *waiter = new Waiter();
waiter->SetOrder(bakemuttonCommand1);
waiter->SetOrder(bakemuttonCommand2);
waiter->SetOrder(bakechickenCommand);
waiter->Notify();
system("pause");
return 0;
}