计算器类UndoRedoCalculator实现两个数的加、减、乘、除运算,支持undo和redo操作

UndoRedoCalculator

 

* 一个计算器类(Calculator)
* 可以实现两个数的加、减、乘、除运算
* 并可以进行undo和redo操作 (undo和redo 就是撤销和重做的操作)

image

基础计算器类 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

posted @ 2023-11-21 15:47  Appinn  阅读(225)  评论(0)    收藏  举报