标签:tco 分离 blog 接受 宏命令 ace 开关 编程 button
命令模式:将“请求”封装成对象,以便使用不同的请求、日志、队列等来参数化其他对象。命令模式也支持撤销操作。
设计原则:
特点:
NoCommand对象:execute()方法为空的对象,即不执行任何操作的对象。客户端处理null操作时交给空对象,而无需做if(command != null)操作。
撤销操作:在管理一组操作对象的对象中可以添加一个上一个操作的对象引用,用于追踪最后调用的命令,并通过命令的undo()方法实现撤销。同样在操作命令对象中也可添加局部变量记录上一个状态以实现undo()方法。
可使用堆栈记录操作过程中的每一个命令,实现多次撤销
宏命令:同时执行多个命令,软编码,传入命令数组,动态决定哪些命令
日志请求:使用命令模式的记录日志,我们可以将上个检查点之后的操作都记录下来,如果系统出现问题,从检查点开始执行命令
队列请求:把一组命令放到队列(先进先出)中,线程从队列中一个一个删除命令,然后调用它的excecute()方法。
类图:
举例:
使用命令模式实现遥控器,遥控器上的不同按钮控制电灯的开关及亮度、天花板风扇的开关及转速等,支持撤销
1、命令接口:Command
1 public interface Command { 2 public void execute(); 3 }
2、对Receiver(灯)实现开关命令
1 public class LightOnCommand implements Command { 2 Light light; 3 public LightOnCommand(Light light) { 4 this.light = light; 5 } 6 public void execute() { 7 light.on(); 8 } 9 } 10 11 public class LightOffCommand implements Command { 12 Light light; 13 public LightOffCommand(Light light) { 14 this.light = light; 15 } 16 public void execute() { 17 light.off(); 18 } 19 }
3、实现Invoker控制
1 public class SimpleRemoteControl { 2 Command slot; 3 public SimpleRemoteControl() {} 4 public void setCommand(Command command) { 5 slot = command; 6 } 7 public void buttonWasPressed() { 8 slot.execute(); 9 } 10 }
4、Client使用Invoker控制器
1 public class RemoteControlTest { 2 public static void main(String[] args) { 3 SimpleRemoteControl remote = new SimpleRemoteControl(); 4 Light light = new Light(); 5 LightOnCommand lightOn = new LightOnCommand(light); 6 remote.setCommand(lightOn); 7 remote.buttonWasPressed(); 8 } 9 }
标签:tco 分离 blog 接受 宏命令 ace 开关 编程 button
原文地址:http://www.cnblogs.com/HectorHou/p/5995049.html