一、命令模式:命令模式将“请求”封装成对象。以便使用不同的请求队列或者日志来参数化其他对象,命令模式也支持可撤销的操作。
(1)命令模式将发出请求的对象和执行请求的对象解耦
(2)在被解耦的两者之间通过命令对象进行沟通的,命令对象接受者和一个或一组动作。
(3)调用者通过调用命令对象的execute()发出请求,这会使得接受者的动作被调用。
(4)调用者可以接受命令当做参数,甚至运行是动态的执行。
二、涉及角色:请求调用者(会传入命令对象,用来发送请求),请求接受者(实际命令执行者),命令接口(所有具体命令实现这个接口),具体命令(将请求的接受者传递给命令对象)。
具体实例:
(1) 命令接口
1 public interface Command {
2 public void execute();
3 }
(2) 具体命令
1 public class LightOnCommand implements Command{ 2 private Light light; 3 4 public LightOnCommand(Light light){ 5 this.light = light; 6 } 7 8 @Override 9 public void execute() { 10 light.on(); 11 } 12 }
(3) 命令接受者
1 public class Light { 2 3 public void on(){ 4 System.out.println("电灯被打开"); 5 } 6 }
(4) 命令调用者
1 public class SimpleRemoteControl { 2 private Command slot; 3 4 public SimpleRemoteControl(){} 5 6 public void setCommand(Command slot){ 7 this.slot = slot; 8 } 9 public void buttonWasPressed(){ 10 slot.execute(); 11 } 12 13 }
(5) 客户端
1 public class SimpleRemoteControl { 2 private Command slot; 3 4 public SimpleRemoteControl(){} 5 6 public void setCommand(Command slot){ 7 this.slot = slot; 8 } 9 public void buttonWasPressed(){ 10 slot.execute(); 11 } 12
三、命令撤销
调用Command中undo()方法,即命令对象中除了维持接收者对象的引用,同时记录之前执行的命令。来达到撤销的目的。
四、宏命令
为了一次执行多个命令,可以建立宏命令对象,宏对象中保持了命令的数组,并可以一次执行和撤销相应的命令。