Topic:我们要制作一个简易的遥控器,有两个控制灯开关的按钮,并有一个操作回退按钮。
首先,我们先来定义一个接收者的角色,也就是最后执行动作的那个对象 —— Light.java,控制着灯的开启和关闭。
public class Light { public void on() { System.out.println("灯亮了..."); } public void off() { System.out.println("灯暗了..."); }}
现在,我们要定义一个命令角色。一般是一个接口,为所有的命令对象声明一个接口,规范将要进行的命令操作。
public interface Command { /** * 执行命令 */ void execute(); /** * 撤销命令 */ void undo();}
有了命名角色后,我们要构建具体命令角色。具体命令实现了命令接口,定义了动作和接收者之间的绑定关系。这里,我们有两个具体命令对象—— LightOnCommand.java(开灯命令)、LightOffCommand.java(关灯命令)
public class LightOnCommand implements Command { private Light light; public LightOnCommand(Light light) { this.light = light; } @Override public void execute() { light.on(); } @Override public void undo() { light.off(); }}
public class LightOffCommand implements Command { private Light light; public LightOffCommand(Light light) { this.light = light; } @Override public void execute() { light.off(); } @Override public void undo() { light.on(); }}
前面,我们定义了动作的接收方和联系中介 —— 命名对象。现在,我们要着手构建请求者角色了。请求者持有一个命令对象,有一个行动方法。它会在某个时间点执行行动方法,但不关心是谁具体执行了这个动作。
public class RemoteInvoker { /** * 开关命令数组,模拟有很多对开关数组 */ private Command[] onCommands; private Command[] offCommands; /** * 撤销(回退)命令 */ private Command undoCommand; public RemoteInvoker(int length) { // 有几组开关,就设置多少数组 onCommands = new Command[length]; offCommands = new Command[length]; // 把每个命令初始化成空命令,避免空指针异常 Command noCommand = new NoCommand(); undoCommand = noCommand; for (int i = 0; i < length; i++) { onCommands[i] = noCommand; offCommands[i] = noCommand; } } /** * @Description 设置命令对象 * @date 2018/11/29 09:15 * @param slot 遥控器的位置 * @param onCommand 开的命令 * @param offCommand 关的命令 * @return void */ public void setCommond(int slot, Command onCommand, Command offCommand) { onCommands[slot] = onCommand; offCommands[slot] = offCommand; } public void onButton(int slot) { onCommands[slot].execute(); //为撤销(回退)按钮记录动作 undoCommand = onCommands[slot]; } public void offButton(int slot) { offCommands[slot].execute(); //为撤销(回退)按钮记录动作 undoCommand = offCommands[slot]; } public void undoButton() { undoCommand.undo(); }}
前面,我们定义好了请求者、接收者已经两者之间的联系中介 —— 命令对象。但是这几个角色对象之间都是松耦合的,还没有一个具体动作的流程,现在我们利用客户端角色把整个动作流程串联在一起。
public class RemoteClient { public static void main(String[] args) { // 1、创建接收者 Light light = new Light(); // 2、创建命令对象 LightOnCommand lightOnCommand = new LightOnCommand(light); LightOffCommand lightOffCommand = new LightOffCommand(light); // 3、创建一组开关并用命令对象装载它 RemoteInvoker invoker = new RemoteInvoker(1); invoker.setCommond(0, lightOnCommand, lightOffCommand); // 4、测试 invoker.onButton(0); invoker.offButton(0); invoker.undoButton(); }}
联系客服