设计模式---命令模式

来源:互联网 发布:adobe flash mac 编辑:程序博客网 时间:2024/05/27 08:13
命令模式
将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。
只有在真正需要如撤销,恢复操作等功能时,把原来的代码重构为命令模式才有意义。

#include<iostream>
#include<list>

using namespace std;

class Barbecuer
{
    public:
        void BakeMutton()
        {
            cout<<" bake goat meat\n";
        }
        void BakeChicken()
        {
            cout<<" bake chicken meat\n";
        }
};


class Command
{
    protected:
        Barbecuer *receiver;
    public:
        Command(Barbecuer *receiver)
        {
            this->receiver = receiver;
        }
        virtual void ExcuteCommand(){}
};

class BakeMuttonCommand:public Command
{
    public:
        BakeMuttonCommand(Barbecuer *receiver):Command(receiver)
        {
        }

        void ExcuteCommand()
        {
            receiver->BakeMutton();
        }
};

class BakeChickenCommand:public Command
{
    public:
        BakeChickenCommand(Barbecuer *receiver):Command(receiver)
        {
        }
        void ExcuteCommand()
        {
            receiver->BakeChicken();
        }
};

class Waiter
{
    private:
        list<Command*> orders ;
    public:
        Waiter(){ }
        void SetOrder(Command *cmd)
        {
            orders.push_back(cmd);
            cout<<"increase orders...\n";
        }
        void CanOrder(Command *cmd)
        {
            orders.remove(cmd);
            cout<<"cancel orders...\n";
        }
        void Notify()
        {
            list<Command*>::iterator it;
            for(it = orders.begin();it!= orders.end();it++)
            {
                (*it)->ExcuteCommand();
            }
        }
};

int main()
{
    Barbecuer *bb = new Barbecuer();
    Command *bacmd1 = new BakeMuttonCommand(bb);
    Command *bacmd3 = new BakeMuttonCommand(bb);
    Command *bacmd2 = new BakeChickenCommand(bb);

    Waiter *girl = new Waiter();
    girl->SetOrder(bacmd1);
    girl->SetOrder(bacmd2);
    girl->SetOrder(bacmd3);

    girl->Notify();

    girl->CanOrder(bacmd1);
    girl->Notify();
    return 0;

}


原创粉丝点击