设计模式 命令模式 之 管理智能家电(二)

2014-11-23 22:28:16 · 作者: · 浏览: 1
ntrolPanel controlPanel = new ControlPanel(); // 为每个按钮设置功能 controlPanel.setCommand(0, new LightOnCommond(light)); controlPanel.setCommand(1, new LightOffCommond(light)); controlPanel.setCommand(2, new ComputerOnCommond(computer)); controlPanel.setCommand(3, new ComputerOffCommond(computer)); controlPanel.setCommand(4, new DoorOnCommond(door)); controlPanel.setCommand(5, new DoorOffCommond(door)); // 模拟点击 controlPanel.keyPressed(0); controlPanel.keyPressed(2); controlPanel.keyPressed(3); controlPanel.keyPressed(4); controlPanel.keyPressed(5); controlPanel.keyPressed(8);// 这个没有指定,但是不会出任何问题,我们的NoCommand的功劳 } }

输出结果:

\

可以看到任意按钮可以随意配置任何命令,再也不需要尼玛的变一下需求改代码了,随便用户怎么个性化了。其实想白了,这里的设置我们还可以配置到一个配置文件中,完全的解耦有木有。< http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+PGJyPgo8L3A+CjxwPrrDwcujrNPDu6e21NPa1eK49rC0xaW/ycTcu7myu8rHzKvC+tLio6zTw7unz6PN+9K5ye7Iy76ytcTKsbryo6zE3Lm7zOG5qbj2sLTFpdaxvdO52MPFoaK52LXGoaK/qrXnxNSjrKOso6yjrLTzvNK2rrXEo6yjrKOsztLDx8nUzqLQ3rjEz8K0+sLro6zC+tfjy/s8L3A+CjxwPrao0uXSu7j2w/zB7qOs08O7p7jJ0rvQqcHQtcTKwqOsv8nF5NbDo6zH0tPr1K3AtLXEw/zB7rGjs9a907/a0rvWwqO6PC9wPgo8cD48cHJlIGNsYXNzPQ=="brush:java;">package com.zhy.pattern.command; /** * 定义一个命令,可以干一系列的事情 * * @author zhy * */ public class QuickCommand implements Command { private Command[] commands; public QuickCommand(Command[] commands) { this.commands = commands; } @Override public void execute() { for (int i = 0; i < commands.length; i++) { commands[i].execute(); } } }
好了,已经满足 丝的需求了。我们测试看看。

// 定义一键搞定模式
		QuickCommand quickCommand = new QuickCommand(new Command[] { new DoorOffCommond(door),
				new LightOffCommond(light), new ComputerOnCommond(computer) });
		System.out.println("****点击一键搞定按钮****");
		controlPanel.setCommand(8, quickCommand);
		controlPanel.keyPressed(8);


是不是很完美。


最后,继续来谈谈命令模式,命令模式就是把命令封装成对象,然后将动作请求者与动作执行者完全解耦,上例中遥控器的按钮和电器一毛钱关系都没吧。

还记得定义中提到了队列,命令模式如何用于队列呢,比如饭店有很多个点菜的地方,有一个做菜的地方,把点菜看作命令,做菜看作命令执行者,不断有人点菜就相当于把菜加入队列,对于做菜的只管从队列里面取,取一个做一个。

定义中还提到了日志,日志一般用于记录用户行为,或者在异常时恢复时用的,比如每个命令现在包含两个方法,一个执行execute,一个undo(上例中为了方便大家理解,没有写undo),我们可以把用户所有命令调用保存到日志中,比如用户操作不当了,电器异常了,只需要把日志中所有的命令拿出来执行一遍undo就完全恢复了,是吧,就是这么个意思。


好了,各位留个言、点个赞算是对我的支持,多谢大家~