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

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);
    }
}
相关推荐
IDRSolutions_CN12 分钟前
PDF 合并测试:性能与内容完整性
java·经验分享·pdf·软件工程·团队开发
TDengine (老段)12 分钟前
TDengine 在新能源领域的价值
java·大数据·数据库·人工智能·时序数据库·tdengine·涛思数据
helloworld工程师14 分钟前
Java实现PDF加水印功能:技术解析与实践指南
java·开发语言·pdf
编程乐学(Arfan开发工程师)31 分钟前
10、底层注解-@Conditional条件装配
java·spring boot·后端·架构
五花肉村长32 分钟前
Linux-进程信号
linux·运维·服务器·开发语言·网络·c++
爬菜42 分钟前
包装类(1)
java
带刺的坐椅43 分钟前
高德地图 MCP,可用 Java SolonMCP 接入(支持 java8, java11, java17, java21)
java·ai·solon·高德地图·lbs·mcp
AA-代码批发V哥1 小时前
Java-List集合类全面解析
java·开发语言·list
cainiao0806051 小时前
Java大数据机器学习模型在金融衍生品风险建模中的创新实践
java·金融
羚羊角uou1 小时前
【C++】map和multimap的常用接口详解
开发语言·c++