定义:命令模式将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。
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 设计模式》