命令模式

来源:互联网 发布:上海然旭网络怎么样 编辑:程序博客网 时间:2024/06/06 00:29

命令模式(Command)是一种对象行为性模式。

1.目的

将请求封装为一个对象,从而可以用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。这里的不同请求参数化相当于例子中BOSS可以自由选择刺客集团。利用命令模式向对象提交请求,但并不需要知道被请求的操作或者请求的接受者的任何信息。例如BOSS给A集团的指令也是KILL,但是A集团的刺客执行的时候就打了个折扣;而且BOSS也无从查找到底是哪个刺客没有认真执行命令。(见例子)

2.适用性

(1)抽象出待执行的动作以参数化某对象。这样我们可以动态改变要执行的动作。

(2)在不同的时刻指定、排列和执行请求。这得益于接受者的动态绑定。

(3)支持取消操作和修改日志等,这些都需要额外的存储信息,如取消操作需要存储以前的命令以及状态等。

3.优缺点

(1)最大的特点在于解耦操作请求者和执行者。比如例子中BOSS和刺客相互都不知道对方是谁。

(2)易于扩展,如果想增加一个执行特殊任务的忍者集团以及旗下刺客,则很容易实现而且不会影响既存的集团A和B。

4.代码示例

******************************************  假如存在一个服务于BOSS的忍者刺客集团A和B,BOSS 给出一系列刺杀名单,而由下属的刺客集团去完成这些 刺杀任务。但由于安全性考虑,BOSS还是不要知道任务 是具体由哪个忍者完成为好,只需想集团要给出指令就行。 具体的任务完成过程有谁完成则无关紧要。******************************************///相当于Receiver,执行实际的过程class Ninja1{public:void Action(){cout<<"Ninja1 complete the missoin(But not kill)~"<<endl;}};class Ninja2{public:void Action(){cout<<"Ninja2 complete the mission(Kill it)~"<<endl;}};//相当于Command基类,定义出执行接口class NinjaLeader{public:virtual void Execute() const=0;};//相当于Command具类,发出命令给接受者class NinjaLeaderA:public NinjaLeader{public:NinjaLeaderA(Ninja1* ninja1):_ninja(ninja1){}//向属于自己的忍者发命令virtual void Execute() const{//忍者执行命令_ninja->Action();}private:Ninja1* _ninja;};class NinjaLeaderB:public NinjaLeader{public:NinjaLeaderB(Ninja2* ninja2):_ninja(ninja2){}virtual void Execute() const{_ninja->Action();}private:Ninja2* _ninja;};//相当于Invoker,要求该命令执行请求class Boss{public://传达命令给刺客集团void Kill(){for(vector<NinjaLeader*>::iterator index=_ninja.begin();index!=_ninja.end();++index)(*index)->Execute();}//当然要告诉BOSS集团的成员,包含执行一级任务的A类,二级任务的B类刺客集团void GiveMission(NinjaLeader* ninja){_ninja.push_back(ninja);}private:vector<NinjaLeader*> _ninja;};

5.测试用例

//这些是真正执行任务的刺客Ninja1* nj1=new Ninja1;Ninja2* nj2=new Ninja2;//领导得先找到自己旗下的刺客NinjaLeaderA* LeaderA=new NinjaLeaderA(nj1);NinjaLeaderB* LeaderB=new NinjaLeaderB(nj2);//BOSS现在给出任务Boss boss;boss.GiveMission(LeaderA);boss.GiveMission(LeaderB);//BOSS说去执行吧~boss.Kill();//OK,命令执行就完成了~

(为了说明各个环节,这个例子稍微有些牵强和隐晦~http://www.cnblogs.com/sjms/archive/2010/07/09/1774069.html给出了一个十分贴切的示例,只不过是用JAVA代码实现的,很值得一看~)

0 0
原创粉丝点击