类图
源码
Command.java package com.demo; public interface Command { /** * 执行命令 */ void execute(); void redo(); /** * 撤销命令 */ void undo(); } Light.java package com.demo; public class Light { public void on() { System.out.println("灯亮了..."); } public void off() { System.out.println("灯暗了..."); } } LightOffCommand.java package com.demo; public class LightOffCommand implements Command { private Light light; public LightOffCommand(Light light) { this.light = light; } @Override public void execute() { light.off(); } @Override public void redo() { light.on(); } @Override public void undo() { light.on(); } } LightOnCommand.java package com.demo; public class LightOnCommand implements Command { private Light light; public LightOnCommand(Light light) { this.light = light; } @Override public void execute() { light.on(); } @Override public void redo() { light.off(); } @Override public void undo() { light.off(); } } NoCommand.java package com.demo; public class NoCommand implements Command { @Override public void execute() { // TODO 自动生成的方法存根 } @Override public void redo() { // TODO 自动生成的方法存根 } @Override public void undo() { // TODO 自动生成的方法存根 } } RemoteInvoker.java package com.demo; public class RemoteInvoker { /** * 开关命令数组,模拟有很多对开关数组 */ private Command[] onCommands; private Command[] offCommands; /** * 撤销(回退)命令 */ private Command undoCommand; private Command redoCommand; public RemoteInvoker(int length) { // 有几组开关,就设置多少数组 onCommands = new Command[length]; offCommands = new Command[length]; // 把每个命令初始化成空命令,避免空指针异常 Command noCommand = new NoCommand(); undoCommand = noCommand; redoCommand = noCommand; for (int i = 0; i < length; i++) { onCommands[i] = noCommand; offCommands[i] = noCommand; } } 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]; redoCommand = onCommands[slot]; } public void offButton(int slot) { offCommands[slot].execute(); //为撤销(回退)按钮记录动作 undoCommand = offCommands[slot]; redoCommand = onCommands[slot]; } public void undoButton() { undoCommand.undo(); } public void redoButton() { // TODO 自动生成的方法存根 redoCommand.redo(); } } Client.java package com.demo; public class Client { 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); System.out.println("撤销命令"); invoker.undoButton(); System.out.println("重做命令"); invoker.redoButton(); } }
测试截图