``mermaid
classDiagram
Command <|-- AddCommand
CommandManager o-- Command
CommandManager --> Calculator
class Command {
<<interface>>
+execute() void
+undo() void
}
class AddCommand {
-int value
-int previousValue
-Calculator calculator
+execute() void
+undo() void
}
class Calculator {
-int result
+add(int value) void
+getResult() int
+setResult(int result) void
}
class CommandManager {
-Stack~Command~ executedCommands
-Stack~Command~ undoneCommands
+executeCommand(Command command) void
+undo() void
+redo() void
}
```
![复制代码](https://assets.cnblogs.com/images/copycode.gif)
package Tutorial16;
import java.util.Stack;
// 1. Command接口,定义执行和撤销方法
interface Command {
void execute();
void undo();
}
// 2. AddCommand具体命令类,模拟加法操作
class AddCommand implements Command {
private int value;
private int previousValue;
private Calculator calculator;
public AddCommand(Calculator calculator, int value) {
this.calculator = calculator;
this.value = value;
}
@Override
public void execute() {
previousValue = calculator.getResult();
calculator.add(value);
}
@Override
public void undo() {
calculator.setResult(previousValue);
}
}
// 3. Calculator类,存储结果
class Calculator {
private int result = 0;
public void add(int value) {
result += value;
}
public int getResult() {
return result;
}
public void setResult(int result) {
this.result = result;
}
}
// 4. CommandManager类,管理命令的执行和撤销
class CommandManager {
private Stack<Command> executedCommands = new Stack<>();
private Stack<Command> undoneCommands = new Stack<>();
public void executeCommand(Command command) {
command.execute();
executedCommands.push(command);
undoneCommands.clear(); // 每次执行新命令时清空撤销栈
}
public void undo() {
if (!executedCommands.isEmpty()) {
Command command = executedCommands.pop();
command.undo();
undoneCommands.push(command);
}
}
public void redo() {
if (!undoneCommands.isEmpty()) {
Command command = undoneCommands.pop();
command.execute();
executedCommands.push(command);
}
}
}
// 5. 测试类
public class Main {
public static void main(String[] args) {
Calculator calculator = new Calculator();
CommandManager manager = new CommandManager();
// 执行几个加法命令
manager.executeCommand(new AddCommand(calculator, 10));
manager.executeCommand(new AddCommand(calculator, 20));
System.out.println("当前结果: " + calculator.getResult()); // 30
// 撤销最后一个命令
manager.undo();
System.out.println("撤销后结果: " + calculator.getResult()); // 10
// 重做最后一个撤销的命令
manager.redo();
System.out.println("重做后结果: " + calculator.getResult()); // 30
}
}