计算器类UndoRedoCalculator实现两个数的加、减、乘、除运算,支持undo和redo操作
UndoRedoCalculator
* 一个计算器类(Calculator)
* 可以实现两个数的加、减、乘、除运算
* 并可以进行undo和redo操作 (undo和redo 就是撤销和重做的操作)
基础计算器类 BasicCalculator 提供了基础计算方法calc, 基于给定的操作符和数值, 计算出累积结果
/**
* 基本计算器
*
*/
class BasicCalculator {
private int total = 0;
public void calc(char curOperator, int num) {
int before = total;
switch (curOperator) {
case '+':
total += num;
break;
case '-':
total -= num;
break;
case '*':
total *= num;
break;
case '/':
total /= num;
break;
}
System.out.println(before +"" + curOperator +num+"=" + total);
}
}
抽象类 Command 定义了 抽象方法 execute 和 reverse
abstract class Command {
abstract public void execute();
abstract public void reverse();
}
CalculatorCommand类 继承Command 实现了上述方法 该类的构造函数参数为 BasicCalculator basicCalculator, char curOperator, int num
execute方法的实现为 basicCalculator.calc(curOperator, num);
reverse方法的实现为 basicCalculator.calc(undo(curOperator),num);
class CalculatorCommand extends Command {
char curOperator;
int num;
BasicCalculator basicCalculator;
public CalculatorCommand(BasicCalculator basicCalculator, char curOperator, int num) {
this.basicCalculator = basicCalculator;
this.curOperator = curOperator;
this.num = num;
}
public char getCurOperator() {
return curOperator;
}
public void setCurOperator(char curOperator) {
this.curOperator = curOperator;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public BasicCalculator getCalculator() {
return basicCalculator;
}
public void setCalculator(BasicCalculator basicCalculator) {
this.basicCalculator = basicCalculator;
}
@Override
public void execute() {
basicCalculator.calc(curOperator, num);
}
@Override
public void reverse() {
basicCalculator.calc(undo(curOperator), num);
}
private char undo(char op) {
char undo = ' ';
switch (op) {
case '+':
undo = '-';
break;
case '-':
undo = '+';
break;
case '*':
undo = '/';
break;
case '/':
undo = '*';
break;
}
return undo;
}
}
UndoRedoCalculator类为主计算器 内部的属性有 BasicCalculator basicCalculator List commands 和 int currentIndex 其calc方法接收到指定操作符和数值后,构建命令对象 CalculatorCommand(basicCalculator, curOperator, num)
调用execute方法来执行, 并将命令对象添加到commands列表中记录
且记录当前的命令位置currentIndex
当调用undo方法时, 根据索引倒序查找范围内相应的原始CalculatorCommand,调用reverse方法
当调用redo方法时, 根据索引正序查找范围内相应的原始CalculatorCommand,调用execute方法
代码为 :
public class UndoRedoCalculator {
private BasicCalculator basicCalculator = new BasicCalculator();
private List<Command> commands = new ArrayList<Command>();
private int currentIndex = 0;
//计算
public void calc(char curOperator, int num) {
Command command = new CalculatorCommand(basicCalculator, curOperator, num);
command.execute();
commands.add(command);
currentIndex++;
}
//重做
public void redo(int levels) {
System.out.println("Redo" + levels);
for (int i = 0; i < levels; i++)
if (currentIndex < commands.size() - 1) {
((Command) commands.get(currentIndex++)).execute();
}else {
System.out.println("没有可redo的数据!");
}
}
//撤销
public void undo(int levels) {
System.out.println("Undo" + levels);
for (int i = 0; i < levels; i++)
if (currentIndex > 0) {
int index = --currentIndex;
Command command= (Command)commands.get(index);
command.reverse();
}else {
System.out.println("没有可undo的数据!");
}
}
}
运行类为:
class RunMain {
public static UndoRedoCalculator calculator = new UndoRedoCalculator();
public static void main(String[] args) {
calculator.calc('+', 100);//加法
calculator.calc('-', 50);//减法
calculator.calc('*', 10);//乘法
calculator.calc('/', 2);//除法
calculator.undo(4);//撤销前四个步骤
calculator.redo(3);//再次执行三个步骤
//再次执行
calculator.calc('+', 2);//加法
}
}
完整的代码地址:
https://github.com/fiftyonejiao/UndoRedoCalculator


浙公网安备 33010602011771号