设计模式-命令模式

来源:互联网 发布:社交网络迅雷下载 编辑:程序博客网 时间:2024/06/14 00:18

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