命令模式定义:将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销操作。
简单定义:封装请求成为对象。
简单例子:
实现命令接口:
Command.java
package headfirst.command.simpleremote;
public interface Command {
public void execute();
}
实现具体命令:
LightOnCommand.java
package headfirst.command.simpleremote;
public class LightOnCommand implements Command {
Light light;
public LightOnCommand(Light light) {
this.light = light;
}
public void execute() {
light.on();
}
}
Light.java
package headfirst.command.simpleremote;
public class Light {
public Light() {
}
public void on() {
System.out.println("Light is on");
}
public void off() {
System.out.println("Light is off");
}
}
SimpleRemoteControl.java
package headfirst.command.simpleremote;
//
// This is the invoker
//
public class SimpleRemoteControl {
Command slot;
public SimpleRemoteControl() {}
public void setCommand(Command command) {
slot = command;
}
public void buttonWasPressed() {
slot.execute();
}
}
测试:
package headfirst.command.simpleremote;
public class RemoteControlTest {
public static void main(String[] args) {
SimpleRemoteControl remote = new SimpleRemoteControl();
Light light = new Light();
LightOnCommand lightOn = new LightOnCommand(light);
remote.setCommand(lightOn);
remote.buttonWasPressed();
}
}
输出:Light is on
要实现撤销,只须在接口里加入undo方法,在实现里记录状态,并在调用undo时回到前一个状态即可。