设计模式-命令模式

命令模式(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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值