六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 27|回复: 0

设计模式之命令模式

[复制链接]

升级  51%

109

主题

109

主题

109

主题

举人

Rank: 3Rank: 3

积分
353
 楼主| 发表于 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;}
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表