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

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);
    }
}
相关推荐
冷雨夜中漫步1 小时前
Python快速入门(6)——for/if/while语句
开发语言·经验分享·笔记·python
JH30732 小时前
SpringBoot 优雅处理金额格式化:拦截器+自定义注解方案
java·spring boot·spring
m0_736919103 小时前
C++代码风格检查工具
开发语言·c++·算法
Coder_Boy_4 小时前
技术让开发更轻松的底层矛盾
java·大数据·数据库·人工智能·深度学习
2501_944934734 小时前
高职大数据技术专业,CDA和Python认证优先考哪个?
大数据·开发语言·python
invicinble4 小时前
对tomcat的提供的功能与底层拓扑结构与实现机制的理解
java·tomcat
较真的菜鸟4 小时前
使用ASM和agent监控属性变化
java
黎雁·泠崖4 小时前
【魔法森林冒险】5/14 Allen类(三):任务进度与状态管理
java·开发语言
2301_763472465 小时前
C++20概念(Concepts)入门指南
开发语言·c++·算法
TechWJ5 小时前
PyPTO编程范式深度解读:让NPU开发像写Python一样简单
开发语言·python·cann·pypto