c++设计模式2:命令行模式

这是我在c++思考第二卷见到的例子
如下(做了一些改正);
dev c++编程环境
  1. #include <cstdlib>
  2. #include <iostream>
  3. #include <ctime>
  4. #include <vector>
  5. #include <memory>
  6. using namespace std;
  7. class Task
  8. {
  9. public:
  10.     virtual void operation()=0;        
  11. };
  12. class TaskRunner
  13. {
  14. public:
  15.    static void add(Task& t) {Tasks.push_back(&t);}
  16.    static void run()
  17.    {
  18.         vector<Task*>::iterator itr = Tasks.begin();
  19.         while(itr!=Tasks.end())
  20.            (*itr++)->operation();      
  21.    }    
  22. private:  
  23.    static std::vector<Task*> Tasks;
  24.    TaskRunner(){}
  25.    TaskRunner& operator=(TaskRunner&);
  26.    TaskRunner(const TaskRunner&);
  27.    static std::auto_ptr<TaskRunner> tr;
  28. };
  29. std::auto_ptr<TaskRunner> TaskRunner::tr;
  30. vector<Task*> TaskRunner::Tasks;
  31. class EventSimulator
  32. {
  33. public:
  34.    EventSimulator(): creation(clock())
  35.    {
  36.        delay = CLOCKS_PER_SEC/4*(rand()%20 +1);
  37.        cout<<"delay = "<<delay <<endl;                 
  38.    }   
  39.    bool fired()
  40.    {
  41.        return clock()>creation + delay;
  42.    }          
  43. private:
  44.    clock_t creation;
  45.    clock_t delay;       
  46. };
  47. class Button
  48. {
  49. public:
  50.    Button(string name): pressed(false),id(name){}
  51.    void press(){pressed = true;}         
  52.    bool isPressed()
  53.    {
  54.       if(e.fired())press();
  55.       return pressed;   
  56.    }
  57.    friend ostream&
  58.    operator<<(ostream& os, const Button& b)
  59.    {return os<<b.id;}  
  60. private:
  61.    bool pressed; 
  62.    string id;
  63.    EventSimulator e;
  64. };
  65. class CheckButton:public Task
  66. {
  67. public:
  68.    CheckButton(Button& b):button(b), handled(false){}
  69.    void operation()
  70.    {
  71.       if(button.isPressed() && !handled)
  72.           cout<<button<<"pressed."<<endl;    
  73.        handled = true;
  74.    }         
  75. private:
  76.    Button&  button;
  77.    bool handled;          
  78. };
  79. void procedure1()
  80. {
  81.      TaskRunner::run();    
  82. }
  83. void procedure2()
  84. {
  85.      TaskRunner::run();
  86. }
  87. void procedure3()
  88. {
  89.      TaskRunner::run();    
  90. }
  91. int main(int argc, char *argv[])
  92. {
  93.     srand(time(0));
  94.     Button b1("button 1"), b2("button 2"), b3("button 3");
  95.     CheckButton cb1(b1), cb2(b2), cb3(b3);
  96.     TaskRunner::add(cb1);
  97.     TaskRunner::add(cb2);
  98.     TaskRunner::add(cb3);
  99.     cout<<"Control-C to exit."<<endl;
  100.    
  101.     while(true)
  102.     {
  103.        procedure1();
  104.        procedure2();
  105.        procedure3();
  106.     }
  107.     system("PAUSE");
  108.     return EXIT_SUCCESS;
  109. }
命令模式是携带行为模式的信使

其特点就是向函数或者对象传递一个想要的动作

一个命令模式简单的例子就是
class A;
class a1 : A
class a2 : A
class a3 : A
...

class B
{
    list<A> alist...
}

在操作的时候
B::.....

个人感觉就是
在处理操作的时候发送一个泛化的命令函数过去,由具体的对象的具体处理函数执行之

当然类B可以做成一个单态模式

感觉还对这个模式不是很....


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值