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;
}
分享到:
相关推荐
设计模式之命令模式 设计模式之命令模式代码 设计模式之命令模式代码
面向对象分析与设计 设计模式之命令模式 面向对象分析与设计 设计模式之命令模式
文章:http://blog.csdn.net/hailushijie/article/details/8719772
23种设计模式之命令模式对命令模式进行了简单的介绍,并附带了例子程序,和大家分享
设计模式之命令模式详解(内附有例子,无源码),2个文件打包在一起上传
java设计模式之命令模式,通过实际生活例子说明命令模式的原理
Java设计模式之命令模式/Java函数式编程 笔记
设计模式这命令模式的Java实现版本和UML设计类图
命令模式(Command) 用意:把一个请求封装到一个对象中,把发出命令和执行命令的责任分开,委派给不同的对象实现。
将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可取消的操作。
本文实例讲述了JS设计模式之命令模式概念与用法。分享给大家供大家参考,具体如下: 客户创建命令;调用者执行该命令;接收者在命令执行时执行相应操作 简单命令对象一般用来消除二个对象(调用者和接收者)之间的...
将《Head First 设计模式》(中文版)按章节进行了分割,每章一个文件,方便大家下载。
命令模式 一个服务可以输出四种符号“A,B,C,D”,现在有多个用户要调用这个服务输出不同的字符,每调用一次输出一个字符,请用命令模式实现一个队列缓冲,用户直接向缓冲中填写命令,服务程序负责循环从队列中取出...