kmplayer 发表于 2013-1-15 02:40:35

设计模式之命令模式

1,命令(command)模式最大的特点:允许向一个函数或者对象传递一个想要的动作.
#include <iostream>#include <vector>using namespace std;class Command{public:    //接口,执行的动作    virtual void execute()=0;};class Hello:public Command{public:    void execute(){ cout<<"Hello!"<<endl; }};class Word:public Command{public:    void execute(){ cout<<"Word!"<<endl; }};class Pattern:public Command{public:    void execute(){ cout<<"Command Pattern!"<<endl; }};class TaskRun{    vector<Command*> commands;public:    //添加命令动作.    void add(Command* e){ commands.push_back(e); }    //执行    void run()    {      vector<Command*>::iterator ite=commands.begin();      while(ite!=commands.end())            (*ite++)->execute();    }};int main(){    TaskRun comptn;    comptn.add(new Hello);    comptn.add(new Word);    comptn.add(new Pattern);    comptn.run();    return 0;}

2,一个稍微复杂的程序
#include <iostream>#include <vector>#include <ctime>#include <string>#include <cstdlib>using namespace std;class Command{public:    //接口,执行的动作    virtual void execute()=0;};class CommandRunner{    //设置为单件    static vector<Command*> commands;    CommandRunner(){}    CommandRunner(const CommandRunner&);    CommandRunner& operator=(CommandRunner&);    static CommandRunner cr;public:    //添加命令动作.    static void add(Command* e){ commands.push_back(e); }    //执行    static void run()    {      vector<Command*>::iterator ite=commands.begin();      while(ite!=commands.end())            (*ite++)->execute();    }};CommandRunner CommandRunner::cr;vector<Command*> CommandRunner::commands;//Command和Runner是一个固定的框架//事件驱动类class EventSimulator{    clock_t creation;    clock_t delay;public:    EventSimulator():creation(clock())    {      delay=CLOCKS_PER_SEC/4*(rand()%20+1);      cout<<"delay= "<<delay<<endl;    }    bool fired()    {      return clock()>creation+delay;    }};//事件驱动按钮class Button{    bool pressed;    string id;    EventSimulator e;public:    Button(string name) : pressed(false), id(name) {}    void press(){ pressed=true; }    bool isPressed()    {      if(e.fired()) press();      return pressed;    }    friend ostream& operator<<(ostream& os,const Button& b)    {      return os<<b.id;    }};//执行按钮class CheckButton:public Command{    Button& button;    bool handled;public:    CheckButton(Button& b) : button(b),handled(false){}    void handle(){ handled=true; }    void execute()    {      if(button.isPressed()&&!handled)      {            cout<<button<<" pressed"<<endl;            handle();      }    }};int main(){    srand(time(0));    Button b1("Button1");    Button b2("Button2");    Button b3("Button3");    CheckButton cb1(b1),cb2(b2),cb3(b3);    CommandRunner::add(&cb1);    CommandRunner::add(&cb2);    CommandRunner::add(&cb3);    while(true)      CommandRunner::run();    return 0;}
页: [1]
查看完整版本: 设计模式之命令模式