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

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);
    }
}
相关推荐
“AI国潮设计-小江”25 分钟前
AIGC实战:Python+SDXL批量生成英歌舞IP立牌,解锁猪猪蛋糕“反差萌”流量密码(附完整API源码)
开发语言·人工智能·python·prompt·aigc
Sirens.32 分钟前
网络通信基础:IP、端口、协议分层与数据封装
java·网络·网络协议·tcp/ip·java-ee·1024程序员节
H.莓飛35 分钟前
【数据结构】排序_OJ题(二):划分与选择
linux·服务器·c语言·开发语言·数据结构·visual studio
CRMEB系统商城43 分钟前
服装连锁的导购分销与企微私域
java·大数据·开发语言·人工智能·小程序·php·1024程序员节
若亦_1 小时前
Java泛型入门:类型安全与上界约束
java·1024程序员节
凉茶钱1 小时前
stack、queue、priority_queue、容器适配器完整梳理
开发语言·c++·queue·1024程序员节·stack
编程的一拳超人1 小时前
【元宝搜索开发者征文大赛】四语实战:Java/Python/Go/Node.js 构建 AI 搜索应用全攻略
java·python·golang·node.js·agent
wuminyu1 小时前
JVM规范学习总结-Java源码经过javac编译后产物
java·linux·c语言·jvm·c++
ly76891 小时前
Spring Security 过滤器链定制:认证、CORS 与 CSRF 的先后顺序
java·spring boot·spring·spring security·csrf·cors·过滤器链
云和数据.ChenGuang1 小时前
Python 菜鸟入门:字典(dict)类型详解与 CRUD 实战案例
开发语言·人工智能·python