定义:命令模式将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。
Client(客户):负责创建一个具体的命令(Concrete Command),并设置其接收者
Invoker(调用者):调用者持有一个命令对象,并在某个时刻调用命令对象的 execute() 方法。
Command(命令接口):包含命令对象的 execute() 方法和 undo() 方法。
ConcreteCommand(具体命令):实现命令接口。包括两个操作,执行命令和撤销命令。
Receiver(接收者):接受命令并执行。
例子
通过遥控器打开电灯
Light
public class Light {
public void on() {
System.out.println("light on");
}
public void off() {
System.out.println("light off");
}
}
Command
public interface Command {
void execute();
}
LightOnCommand
public class LightOnCommand implements Command {
Light light;
public LightOnCommand(Light light) {
this.light = light;
}
public void execute() {
light.on();
}
}
SimpleRemoteControl
public class SimpleRemoteControl {
Command slot;
public void setCommand(Command slot) {
this.slot = slot;
}
public void buttonWasPressed() {
slot.execute();
}
}
RemoteControllerTest
public class RemoteControllerTest {
public static void main(String[] args) {
SimpleRemoteControl remote = new SimpleRemoteControl();
Light light = new Light();
LightOnCommand lightOn = new LightOnCommand(light);
remote.setCommand(lightOn);
remote.buttonWasPressed();
}
}
撤销
可通过简单地记录最后一个被执行的命令,或使用一个堆栈记录操作过程的每一个命令。
宏命令
public class MacroCommand implements Command {
Command[] commands;
public MacroCommand(Command[] commands) {
this.commands = commands;
}
public void execute() {
for(int i=0; i<commands.length; i++) {
commands[i].execute();
}
}
}
空对象(null object)
一个空对象取代 NULL 对象实例的检查。Null 对象不是检查空值,而是反应一个不做任何动作的关系。这样的 Null 对象也可以
在数据不可用的时候提供默认的行为。
例如:遥控器不可能一出厂就设置了有意义的命令对象,所以提供了NoCommand对象作为代用品,当调用它的execute()方法时,这种对象是什么事情都不做.
public class NoCommand implements Command {
public void execute() { }
}
在许多设计模式中,都会看到空对象的使用。甚至有些时候,空对象本身也被视为是一种设计模式。
参考:
《Head first 设计模式》