命令模式(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; }