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

1.面向对象的三大特性

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

2.需求描述

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

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

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. 计算器逻辑实现-中级程序员

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

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;
            }
        }
    }
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 对计算符号及逻辑进行抽象
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 计算符号工厂代码实现
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 最终代码调用
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);
    }
}

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yongge

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值