命令模式

来源:互联网 发布:如何自己做软件 编辑:程序博客网 时间:2024/06/05 15:45

命令模式是一种使用频率非常高的设计模式,它可以将请求发送者与接收者解耦,请求发送者通过命令对象来间接引用请求接收者,使得系统具有更好的灵活性和可扩展性。在基于GUI的软件开发,无论是在电脑桌面应用还是在移动应用中,命令模式都得到了广泛的应用。

 

       1. 主要优点

       命令模式的主要优点如下:

       (1) 降低系统的耦合度。由于请求者与接收者之间不存在直接引用,因此请求者与接收者之间实现完全解耦,相同的请求者可以对应不同的接收者,同样,相同的接收者也可以供不同的请求者使用,两者之间具有良好的独立性。

       (2) 新的命令可以很容易地加入到系统中。由于增加新的具体命令类不会影响到其他类,因此增加新的具体命令类很容易,无须修改原有系统源代码,甚至客户类代码,满足“开闭原则”的要求。

       (3) 可以比较容易地设计一个命令队列或宏命令(组合命令)

       (4) 为请求的撤销(Undo)和恢复(Redo)操作提供了一种设计和实现方案


#include <iostream>#include <vector>using namespace std;class Barbucer{public:    void makeMutton(){        cout<<"makeMutton"<<endl;    }    void makeChickenWing(){        cout<<"makeChickenWing"<<endl;    }};class Command{public:    Command(Barbucer *b):m_receiver(b){}    virtual void executeCmd()=0;protected:    Barbucer *m_receiver;};class MakeMuttonCmd:public Command{public:    MakeMuttonCmd(Barbucer *bb):Command(bb){}    void executeCmd(){        m_receiver->makeMutton();    }};class MakeChickenWingsCmd:public Command{public:    MakeChickenWingsCmd(Barbucer*bb):Command(bb){}    void executeCmd(){        m_receiver->makeChickenWing();    }};//服务员类class Waiter{public:    void addCmd(Command *c){        m_cmdVtr.push_back(c);    }    void Notify(){        for(vector<Command*>::iterator it=m_cmdVtr.begin();            it!=m_cmdVtr.end();++it)            (*it)->executeCmd();    }private:    vector<Command*> m_cmdVtr;};int main(){    Barbucer *bb=new Barbucer;    MakeMuttonCmd *mmCmd=new MakeMuttonCmd(bb);    MakeChickenWingsCmd *mcwCmd=new MakeChickenWingsCmd(bb);    Waiter *wtr=new Waiter;    wtr->addCmd(mmCmd);    wtr->addCmd(mcwCmd);    wtr->Notify();    delete bb;    delete mmCmd;    delete mcwCmd;    delete wtr;    return 0;}