[实验任务一]:多次撤销和重复的命令模式
某系统需要提供一个命令集合(注:可以使用链表,栈等集合对象实现),用于存储一系列命令对象,并通过该命令集合实现多次undo()和redo()操作,可以使用加法运算来模拟实现。
实验要求:
-
提交类图;
-
提交源代码;
// AbstractCommand.java
package command;
public abstract class AbstractCommand {
public abstract int execute(int value);
public abstract int undo();
public abstract int redo();
}
// Adder.java
package command;
public class Adder {
private int num = 0;
public int add(int value) {
num += value;
return num;
}
}
// AddCommand.java
package command;
import java.util.Stack;
public class AddCommand extends AbstractCommand {
private Adder adder;
private Stack<Integer> unStack;
private Stack<Integer> reStack;
public AddCommand(Adder adder) {
this.adder = adder;
this.unStack = new Stack<>();
this.reStack = new Stack<>();
}
@Override
public int execute(int value) {
int result = adder.add(value);
unStack.push(value);
reStack.clear(); // 执行新命令时清空重做栈
return result;
}
@Override
public int undo() {
if (unStack.isEmpty()) {
return 0; // 没有可撤销的操作
}
int value = unStack.pop();
reStack.push(value);
return adder.add(-value); // 撤销就是执行相反的操作
}
@Override
public int redo() {
if (reStack.isEmpty()) {
return 0; // 没有可重做的操作
}
int value = reStack.pop();
unStack.push(value);
return adder.add(value);
}
}
// CalculatorForm.java
package command;
public class CalculatorForm {
private AbstractCommand command;
public CalculatorForm(AbstractCommand command) {
this.command = command;
}
public void compute(int value) {
int result = command.execute(value);
System.out.println("计算结果: " + result);
}
public void undo() {
int result = command.undo();
System.out.println("撤销后结果: " + result);
}
public void redo() {
int result = command.redo();
System.out.println("重做后结果: " + result);
}
}
// Main.java
package command;
public class Main {
public static void main(String[] args) {
// 创建接收者
Adder adder = new Adder();
// 创建命令
AddCommand addCommand = new AddCommand(adder);
// 创建调用者
CalculatorForm calculator = new CalculatorForm(addCommand);
// 测试计算、撤销和重做功能
calculator.compute(5); // 加5
calculator.compute(3); // 加3
calculator.compute(2); // 加2
calculator.undo(); // 撤销加2
calculator.undo(); // 撤销加3
calculator.redo(); // 重做加3
calculator.compute(4); // 加4
}
}
- 注意编程规范。