相关类图
![](https://img2023.cnblogs.com/blog/2808014/202311/2808014-20231120101944016-192901710.png)
具体代码
//Invoker.java
package org.example.test015;
public class Invoker {
public void setCommand(Command command) {
this.command = command;
}
private Command command;
public void addIt(int value) {
command.execute(value);
}
public void undo() {
int i = command.undo();
if (i == -1) {
System.out.println("已经撤销到初态");
}
else {
System.out.println("执行成功!运算结果是 " + i);
}
}
public void redo() {
int i = command.redo();
if (i == -1) {
System.out.println("已经恢复到终态");
}
else {
System.out.println("执行成功!运算结果是 " + i);
}
}
}
//AbstractCommand.java
package org.example.test015;
public abstract class AbstractCommand {
public abstract int execute(int value);
public abstract int undo();
public abstract int redo();
}
//AddCommand.java
package org.example.test015;
import java.util.Stack;
public class AddCommand extends AbstractCommand {
private Addition addition = new Addition();
private Stack<Integer> unStack = new Stack<Integer>();
private Stack<Integer> reStack = new Stack<Integer>();
@Override
public int execute(int value) {//计算操作
int result = 0;
result = addition.addOperate(value);
System.out.println(result);
unStack.push(result);
return result;
}
@Override
public int undo() {//撤回操作
int i = 0;
if (unStack.isEmpty()) {//栈为空
i = -1;
}
else {//栈不空,栈元素弹出
int x = unStack.pop();
reStack.push(x);//放入恢复栈中,便于之后的操作
if (!unStack.isEmpty()) {
i = unStack.peek();
}
}
return i;
}
@Override
public int redo() {//恢复操作
int i = 0;
if (reStack.isEmpty()) {
i = -1;
}
else {
int x = reStack.pop();
unStack.push(x);
i = x;
}
return i;
}
}
//Addition.java
package org.example.test015;
public class Addition {
private int sum = 0;
public int addOperate(int value) {
sum += value;
return sum;
}
}
//Client.java
package org.example.test015;
public class Client {
public static void main(String[] args) {
Invoker invoker = new Invoker();
AbstractCommand command = new AddCommand();
invoker.setCommand(command);
System.out.println("计算过程:");
invoker.addIt(2);
invoker.addIt(3);
invoker.addIt(4);
System.out.println("撤回操作:");
invoker.undo();
invoker.undo();
invoker.undo();
invoker.undo();
System.out.println("恢复操作:");
invoker.redo();
invoker.redo();
invoker.redo();
invoker.redo();
}
}
运行结果
![](https://img2023.cnblogs.com/blog/2808014/202311/2808014-20231120102022585-1008599647.png)