基于计算器实现领略面向对象的艺术

1.面向对象的三大特性

封装、继承和多态是大家耳熟能详的词语了,那如何在代码中实现估计有很多人还是懵逼的,今天就让我们从初级程序员、中级程序员和高级程序员的代码实现中,体会这个三个特性吧。

2.需求描述

请用C++、Java、C#或VB.NET任意一种面向对象语言实现一个计算器控制台程序,要求输入两个数和运算符号,得到结果。

3.计算器逻辑实现-初级程序员

java 复制代码
public class Calculator {
    
    public static void main(String[] args) {

         Scanner scanner = new Scanner(System.in); // 创建Scanner对象

        System.out.println("请输入一个数字");
        String a = scanner.nextLine(); // 读取一行文本

        System.out.println("请输入计算符号(+ - * /)");
        String b = scanner.nextLine(); // 读取一行文本

        System.out.println("请输入一个数字");
        String c = scanner.nextLine(); // 读取一行文本

        BigDecimal result = null;
        if ("+".equals(b)) {
            result = new BigDecimal(a).add(new BigDecimal(c));
        }
        if ("-".equals(b)) {
            result = new BigDecimal(a).subtract(new BigDecimal(c));
        }
        if ("*".equals(b)) {
            result = new BigDecimal(a).multiply(new BigDecimal(c));
        }
        if ("/".equals(b)) {
            result = new BigDecimal(a).divide(new BigDecimal(c));
        }
        System.out.println(result);
         
    }
}

4. 计算器逻辑实现-中级程序员

优化点:将计算逻辑和显示逻辑分开,计算逻辑单独封装,代码如下:

java 复制代码
public class Operator {

        public static BigDecimal calculate(String operator, String numA, String numB) {
            BigDecimal result = null;
            switch(operator){
                case "+":
                    result = new BigDecimal(numA).add(new BigDecimal(numB));
                    break;
                case "-":
                    result = new BigDecimal(numA).subtract(new BigDecimal(numB));
                    break;
                case "*":
                    result = new BigDecimal(numA).multiply(new BigDecimal(numB));
                    break;
                case "/":
                    BigDecimal tmpNumB = new BigDecimal(numB);
                    if(tmpNumB.compareTo(BigDecimal.ZERO) != 0) {
                        result = new BigDecimal(numA).divide(tmpNumB);
                    }
                    break;
                default:
                    break;
            }
        }
    }
java 复制代码
public class Calculator {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in); // 创建Scanner对象

        System.out.println("请输入一个数字");
        String numA = scanner.nextLine(); // 读取一行文本

        System.out.println("请输入计算符号(+ - * /)");
        String operator = scanner.nextLine(); // 读取一行文本

        System.out.println("请输入一个数字");
        String numB = scanner.nextLine(); // 读取一行文本
        BigDecimal result = Operator.calculate(operator, numA, numB);
        System.out.println(result);
    }
}

5. 计算器逻辑实现-高级程序员

优化点:使用简单工厂模式增强代码的扩展性,完美体现面向对象的封装、继承、多态三大特性。

5.1 对计算符号及逻辑进行抽象
java 复制代码
public abstract class Operator {

    abstract BigDecimal calculate(String numA, String numB);
}

class AddOperator extends Operator {

    @Override
    BigDecimal calculate(String numA, String numB) {
        return new BigDecimal(numA).add(new BigDecimal(numB));;
    }
}

class SubOperator extends Operator {

    @Override
    BigDecimal calculate(String numA, String numB) {
        return new BigDecimal(numA).subtract(new BigDecimal(numB));
    }
}

class MultiplyOperator extends Operator {

    @Override
    BigDecimal calculate(String numA, String numB) {
        return new BigDecimal(numA).multiply(new BigDecimal(numB));;
    }
}

class DivideOperator extends Operator {

    @Override
    BigDecimal calculate(String numA, String numB) {
        BigDecimal tmpNumB = new BigDecimal(numB);
        if(tmpNumB.compareTo(BigDecimal.ZERO) != 0) {
            return new BigDecimal(numA).divide(tmpNumB);
        }
    }
}
5.2 计算符号工厂代码实现
java 复制代码
public class OperatorFactory {
    public static Operator Operator(String operator) {
        Operator operatorInstance = null;
        switch (operator) {
            case "+":
                operatorInstance = new AddOperator();
                break;
            case "-":
                operatorInstance = new SubOperator();
                break;
            case "*":
                operatorInstance = new MultiplyOperator();
                ;
                break;
            case "/":
                operatorInstance = new DivideOperator();
                break;
            default:
                break;
        }
        return operatorInstance;
    }
}
5.3 最终代码调用
java 复制代码
public class Calculator {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in); // 创建Scanner对象

        System.out.println("请输入一个数字");
        String numA = scanner.nextLine(); // 读取一行文本

        System.out.println("请输入计算符号(+ - * /)");
        String operator = scanner.nextLine(); // 读取一行文本

        System.out.println("请输入一个数字");
        String numB = scanner.nextLine(); // 读取一行文本
        Operator operatorInstance = OperatorFactory.Operator(operator);
        BigDecimal result = operatorInstance.calculate(numA, numB);
        System.out.println(result);
    }
}
相关推荐
代码狂想家2 分钟前
Rust时序数据库实现:从压缩算法到并发优化的实战之旅
开发语言·rust·时序数据库
黛琳ghz4 分钟前
用 Rust 打造高性能 PNG 压缩服务
开发语言·后端·rust
IT闫9 分钟前
Rust的内存安全与实战落地的直观解析
开发语言·安全·rust
zhouyunjian16 分钟前
syncronized使用与深入研究
java·开发语言
2501_9411126116 分钟前
C++与Docker集成开发
开发语言·c++·算法
chxii16 分钟前
在 VS Code 中用 MyBatis 操作数据库的 Spring Boot 示例
java
明洞日记33 分钟前
【设计模式手册006】建造者模式 - 复杂对象的优雅构建之道
java·设计模式·建造者模式
奇树谦34 分钟前
Qt|Qt5.12.12安装Mqtt
开发语言·qt