臧廷杰最后测试一下代码:[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就完全恢复了,是吧,就是这么个意思。 |
|