资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,*,5.命令模式(Command Pattern),意图:,将一个请求(或动作、命令等)封装,这样的请求就可以带参数进行实例化了。因此,同一个请求,不同的参数,可以是不同的实现结果。,请求可能增加,请求可以是请求队列,请求可以被记录、撤销等。,同一个行为的参数变化,class Some,public:,void Func();,void Func(A*pa);,void Func(A*pa,int arg);,void Func(B*pb);,;,增加,Func(A,*pa,int,arg1,,,int,arg2);,2.,增加,Func(C,*pc),例,class Receiver;,class ReceiverA:public Receiver;,class ReceiverB:public Receiver;,class ReceiverC:public Receiver;,class ReceiverD:public ReceiverC;,class Requester,public:,virtual void DoAction1(ReceiverA*a);,virtualvoidDoAction1(ReceiverB*b);,virtualvoidDoAction2(ReceiverD*d);,;,问题:,1)增加新的ReceiverA2,怎么办?,2)同时增加新的RecieverD2,又怎么办?,3)增加一个新的Action,它是由DoAction1(ReceiverA*a)和,DoAction1(ReceiverB*b)顺序组成的,又怎么办?,4)需要对每个Action,都做日志记录,怎么办?,5)需要对每个Action,都可以做撤销操作,怎么办?,将Requester的DoAction及参数变化单独封装起来,:,class Requester,public:,virtual void DoAction(Command*comd),comd-Excute();,;,class CommandAction2,:public Command,public:,CommandAction2(ReceiverC*rec):receiver(rec),virtual void Excute(),receiver-DoSomething2();,private:,ReceiverC*receiver;,;,由Command区分Action及Receiver:,class Command,public:virtual void Excute()=0;,;,class CommandAction1,:public Command,public:,CommandAction1(Reciveiver*rec),:receiver(rec),virtual void Excute(),receiver-DoSomething1();,private:,Receiver*receiver;,;,队列(例如由两个Command组成的请求队列),class MacroCommod:public Command,public:,MacroCommand(Command*comand1,Command*command2),:cmd1(command1),cmd2(command2),virtual void Excute(),cmd1-Excute();,cmd2-Excute(),private:,Command*cmd1;,Command*cmd2;,;,命令模式结构,命令模式优缺点,好处:,容易构造一个命令队列,便于以日志形式记录命令的执行情况,保留并存储命令执行中的各种信息,可以实现命令的撤销和重做,便于增加新的命令,缺点:可能会有过多的具体命令类存在,
展开阅读全文