面向对象思想设计_计算器小程序(设计模式入门篇_01)

名称:简单计算器程序

面向对象思想的由来:面向对象编程思想的由来是从面向过程演变而来,所以我们用一个简单的计算器程序用面向过程的方式去实现。

以下是面向过程方式实现计算器程序:

public class Main {

    public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);

        System.out.println("input 1 figure...");
        double figure1 = Double.parseDouble(scanner.nextLine());

        System.out.println("input operator...");
        String operator =  scanner.nextLine();

        System.out.println("input 2 figure...");
        double figure2 = Double.parseDouble(scanner.nextLine());

        double resultOperator = 0.0;

        if ("+".equals(operator)) {
            resultOperator = figure1 + figure2;
        } else if ("-".equals(operator)) {
            resultOperator = figure1 - figure2;
        } else if ("*".equals(operator)) {
            resultOperator = figure1 * figure2;
        } else if ("/".equals(operator)) {
            resultOperator = figure1 / figure2;
        }

        System.out.println("result:" + resultOperator);
    }
}

运行效果:
这里写图片描述


这实现起来确实很快,代码运行起来也没有异常,但是并不是代码无错就是优,我们要多方面考虑就知道问题的所在了,例如:以后要在平板电脑上计算,以后要在javaWeb程序上计算,能到这个计算过程都要在去写一遍?,这肯定没有体现出复用性
所以我们要考虑如何复用?
业务封装:

package com.dahua.demo1.b;

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);

        System.out.println("input 1 figure...");
        double figure1 = Double.parseDouble(scanner.nextLine());

        System.out.println("input operator...");
        String operator =  scanner.nextLine();

        System.out.println("input 2 figure...");
        double figure2 = Double.parseDouble(scanner.nextLine());

        double operatorResult = Operator.getOperatorResult(figure1, figure2, operator);
        System.out.println("result:" + operatorResult);
    }

}
package com.dahua.demo1.b;

public class Operator {

    /**
     * 此方法的用于计算两个数的值
     * @param figure1   第一个数值
     * @param figure2   第二个数值
     * @param operator  传入运算符
     * @return
     */
    public static double getOperatorResult(double figure1, double figure2, String operator) {

        double resultOperator = 0.0;

        if ("+".equals(operator)) {
            resultOperator = figure1 + figure2;
        } else if ("-".equals(operator)) {
            resultOperator = figure1 - figure2;
        } else if ("*".equals(operator)) {
            resultOperator = figure1 * figure2;
        } else if ("/".equals(operator)) {
            resultOperator = figure1 / figure2;
        }
        return resultOperator;

    }
}

所以我们定义一个计算类(Operator),里面有一个计算的方法,以后不管是平板电脑程序需要计算,还是JavaWeb程序需要计算 等等,都可以使用这个Operator类的计算方法了,从而实现了复用,面向对象特征之一封装

我们在以面向对象编程思想里考虑,这样写耦合度太高,扩展性也不好,因为如果现在要增加一个平方根运算呢,难道要去修改代码吗?

所以我们以面向对象的思想来考虑的话,抽取共用相同的行为,无论(加 减 乘 除)他们都用算法的行为,所以我们定义一个父类,用子类来实现:

public abstract class Counter {

    private double figure1;

    private double figure2;


    public double getFigure1() {
        return figure1;
    }

    public void setFigure1(double figure1) {
        this.figure1 = figure1;
    }

    public double getFigure2() {
        return figure2;
    }

    public void setFigure2(double figure2) {
        this.figure2 = figure2;
    }

    /**
     * 抽象方法
     * 计算两个数值
     * @return 返回计算结果
     */
    public abstract double counterResult();

}

// 加法类
public class CounterAdd extends Counter{
    public double counterResult() {
        return Operator.getOperatorResult(getFigure1(), getFigure2(), "+");
    }
}

// 减法类
public class CounterMinus extends Counter {
    public double counterResult() {
        return Operator.getOperatorResult(getFigure1(), getFigure2(), "-"); 
    }
}

// 乘法类
public class CounterRide extends Counter {
    public double counterResult() {
        return Operator.getOperatorResult(getFigure1(), getFigure2(), "*");
    }
}

// 除法类
public class CounterRemove extends Counter {
    public double counterResult() {
        return Operator.getOperatorResult(getFigure1(), getFigure2(), "/");
    }
}

// 计算类
public class Operator {

    /**
     * 此方法的用于计算两个数的值
     * @param figure1   第一个数值
     * @param figure2   第二个数值
     * @param operator  传入运算符
     * @return
     */
    public static double getOperatorResult(double figure1, double figure2, String operator) {

        double resultOperator = 0.0;

        if ("+".equals(operator)) {
            resultOperator = figure1 + figure2;
        } else if ("-".equals(operator)) {
            resultOperator = figure1 - figure2;
        } else if ("*".equals(operator)) {
            resultOperator = figure1 * figure2;
        } else if ("/".equals(operator)) {
            resultOperator = figure1 / figure2;
        }
        return resultOperator;  
    }
}

客户端程序调用:

public class Main {

    public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);

        System.out.println("input 1 figure...");
        double figure1 = Double.parseDouble(scanner.nextLine());

        System.out.println("input operator...");
        String operator =  scanner.nextLine();

        System.out.println("input 2 figure...");
        double figure2 = Double.parseDouble(scanner.nextLine());


        Counter counter = CounterFactory.getInstance().getOperator(operator);
        counter.setFigure1(figure1);
        counter.setFigure2(figure2);
        double counterResult = counter.counterResult();
        System.out.println("result:" + counterResult);  
    }
}

执行结果:
这里写图片描述

以上说这些:完全是模拟从一个简单的计算器程序,用常规面向过程思想实现,慢慢的演化到面向对象思想中来体现,以上还有很多不足,没有去完善,主要是体现出面向对象程序设计一种方式。

谢谢大家的观看,更多精彩技术博客,会不断的更新,请大家访问,
刘德利CSDN博客, http://blog.csdn.net/u011967006

  • 9
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值