请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。
Class Diagram
- Command:命令接口
- Receiver:命令接收者,也就是命令真正的执行者
- Invoker:组织命令
Implementation
命令接口
1 2 3
| public interface Command { void execute(); }
|
命令接收者(灯泡)
1 2 3 4 5 6 7 8 9 10
| public class Light { public void on(){ System.out.println("Light is on!"); }
public void off(){ System.out.println("Light is off!"); } }
|
实际命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| public class LightOnCommand implements Command { Light light;
public LightOnCommand(Light light) { this.light = light; }
public void execute() { light.on(); } }
public class LightOffCommand implements Command { Light light;
public LightOffCommand(Light light) { this.light = light; }
public void execute() { light.off(); } }
|
命令组织者(遥控器)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| 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(); } }
|
测试
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| public class CommandTest {
@Test public void test()throws Exception{ 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); } }
|
Example