类图

源码
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();
}
}
测试截图
