命令模式(Command pattern): 将”请求”封闭成对象, 以便使用不同的请求,队列或者日志来参数化其他对象. 命令模式也支持可撤销的操作。
意图
将命令封装成对象中,以便使用命令来参数化其它对象,或者将命令对象放入队列中进行排队,或者将命令对象的操作记录到日志中,以及支持可撤销的操作。
类图
- Command: 命令
- Receiver: 命令接收者,也就是命令真正的执行者
- Invoker: 通过它来调用命令
- Client: 可以设置命令与命令的接收者
实现
设计一个遥控器,可以控制电灯开关。
public interface Command {void execute();}
public class LightOnCommand implements Command {Light light;public LightOnCommand(Light light) {this.light = light;}@Overridepublic void execute() {light.on();}}
public class LightOffCommand implements Command {Light light;public LightOffCommand(Light light) {this.light = light;}@Overridepublic void execute() {light.off();}}
public class Light {public void on() {System.out.println("Light is on!");}public void off() {System.out.println("Light is off!");}}
/*** 遥控器*/public class Invoker {private Command[] onCommands;private Command[] offCommands;private final int slotNum = 7;public Invoker() {this.onCommands = new Command[slotNum];this.offCommands = new Command[slotNum];}public void setOnCommand(Command command, int slot) {onCommands[slot] = command;}public void setOffCommand(Command command, int slot) {offCommands[slot] = command;}public void onButtonWasPushed(int slot) {onCommands[slot].execute();}public void offButtonWasPushed(int slot) {offCommands[slot].execute();}}
public class Client {public static void main(String[] args) {Invoker invoker = new Invoker();Light light = new Light();Command lightOnCommand = new LightOnCommand(light);Command lightOffCommand = new LightOffCommand(light);invoker.setOnCommand(lightOnCommand, 0);invoker.setOffCommand(lightOffCommand, 0);invoker.onButtonWasPushed(0);invoker.offButtonWasPushed(0);}}
