设计模式之命令模式
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]