配色: 字号:
Command Patterngg
2018-04-28 | 阅:  转:  |  分享 
  
臧廷杰最后测试一下代码:[java]?https://blog.csdn.net/lmj623565791/article/details/
24602057viewplain?https://blog.csdn.net/lmj623565791/article/det
ails/24602057copypackage?com.zhy.pattern.command;???public?class?
Test??{???public?static?void?main(String[]?args)???{???/???三个家
电??/??Light?light?=?new?Light();???Door?door?=?new?Door();???Com
puter?computer?=?new?Computer();???/???一个控制器,假设是我们的app主界面??/?
?ControlPanel?controlPanel?=?new?ControlPanel();???//?为每个按钮设置功能??
controlPanel.setCommand(0,?new?LightOnCommond(light));???controlP
anel.setCommand(1,?new?LightOffCommond(light));???controlPanel.se
tCommand(2,?new?ComputerOnCommond(computer));???controlPanel.setC
ommand(3,?new?ComputerOffCommond(computer));???controlPanel.setCo
mmand(4,?new?DoorOnCommond(door));???controlPanel.setCommand(5,?n
ew?DoorOffCommond(door));????//?模拟点击??controlPanel.keyPressed(0);
???controlPanel.keyPressed(2);???controlPanel.keyPressed(3);???co
ntrolPanel.keyPressed(4);???controlPanel.keyPressed(5);???control
Panel.keyPressed(8);//?这个没有指定,但是不会出任何问题,我们的NoCommand的功劳?????}??}?
?输出结果:可以看到任意按钮可以随意配置任何命令,再也不需要尼玛的变一下需求改代码了,随便用户怎么个性化了。其实想白了,这里的设置
我们还可以配置到一个配置文件中,完全的解耦有木有。好了,臧廷杰大成对于这个按钮可能还不是太满意,用户希望夜深人静的时候,能够提供
个按钮直接关门、关灯、开电脑,,,,大家懂的,,,我们稍微修改下代码,满足他定义一个命令,用户干一些列的事,可配置,且与原来的命令
保持接口一致:[java]?https://blog.csdn.net/lmj623565791/article/details/
24602057viewplain?https://blog.csdn.net/lmj623565791/article/det
ails/24602057copypackage?com.zhy.pattern.command;???/???定义一个命令
,可以干一系列的事情??????@author?zhy?????/?public?class?QuickCommand?i
mplements?Command??{???private?Command[]?commands;????public?Quic
kCommand(Command[]?commands)???{???this.commands?=?commands;???}?
???@Override??public?void?execute()???{???for?(int?i?=?0;?i?mands.length;?i++)???{???commands[i].execute();???}???}???}??好了,已
经满足屌丝的需求了。我们测试看看。[java]?https://blog.csdn.net/lmj623565791/articl
e/details/24602057viewplain?https://blog.csdn.net/lmj623565791/a
rticle/details/24602057copy//?定义一键搞定模式??QuickCommand?quickCommand
?=?new?QuickCommand(new?Command[]?{?new?DoorOffCommond(door),???n
ew?LightOffCommond(light),?new?ComputerOnCommond(computer)?});???
System.out.println("点击一键搞定按钮");???controlPanel.setCommand
(8,?quickCommand);???controlPanel.keyPressed(8);??是不是很完美。最后,继续来谈谈
命令模式,命令模式就是把命令封装成对象,然后将动作请求者与动作执行者完全解耦,上例中遥控器的按钮和电器一毛钱关系都没吧。还记得定义
中提到了队列,命令模式如何用于队列呢,比如饭店有很多个点菜的地方,有一个做菜的地方,把点菜看作命令,做菜看作命令执行者,不断有人点
菜就相当于把菜加入队列,对于做菜的只管从队列里面取,取一个做一个。定义中还提到了日志,日志一般用于记录用户行为,或者在异常时恢复时
用的,比如每个命令现在包含两个方法,一个执行execute,一个undo(上例中为了方便大家理解,没有写undo),我们可以把用户所有命令调用保存到日志中,比如用户操作不当了,电器异常了,只需要把日志中所有的命令拿出来执行一遍undo就完全恢复了,是吧,就是这么个意思。
献花(0)
+1
(本文系臧廷杰首藏)