您的位置:首页 > 其它

简单计算器的实现

2015-09-21 11:12 411 查看
简单计算器其实就是对于两个运算数的操作。那么,当程序从简单到复杂的过程中,容易出现这样的问题,运算可能有多种情况,当有新的运算要加入时,如何添加新的运算是程序的重点。比如,一个薪资系统,老板,经理,你的工资算法都是在一个类里,当需要添加一个实习生的工资时,如果在原类中进行修改,那么你的工资就喝老板的工资都成透明的了,不便于数据的保护。如何实现可扩展,可维护,可复用,灵活呢,就简单实用一下工厂模式。

1. 面试题:实现两个数的计算器

乍一看,很简单。顺序从头到脚,从输入到输出即可。

public class Calculator{
    private String A;
    private String B;
    A = input();
    B = input();
    private String C;
    C = inputOper();
    if(C == '+'){
        System.out.println(A+B);
    }
    if(C == '-'){
        System.out.println(A+B);
    }
    if(C == '*'){
        System.out.println(A+B);
    }
    if(C == '/'){
        System.out.println(A+B);
    }


程序写完了,如果你是想做计算机方面工作的,那么请你放弃吧,这里不是你的未来。

首先,命名问题,其次是程序的逻辑问题。

2. 使用面向对象思想

面向对象就是为了满足程序的可维护,可扩展,和可复用的要求。一个很好的例子:活字印刷。只需要改字,便可以满足要求;并且,这些字还可以用在其他的文章中,便可以满足复用;如果要加字,只需要另外刻字,便可以满足扩展;

那么,如何让面向对象来满足计算器的方法呢?

准确的说,就是让业务和逻辑进行分离,可以说,这是所有编程的必备思想;

另外,一个优秀的程序员会分析代码的创建过程中,执行的效率问题。比如是否有不必要的编译和执行等。如何避免不必要的实例化问题;

简单工厂模式就是实现实例化的过程:我拥有很多简单的原材料,但是要加工成不同的玩具,还是根据我的工厂模具来定型;

3. 代码实现

程序功能组成:

1. 加法

2. 减法

3. 新增加乘法

实现过程:

1. 创建基础的操作类

// 两个操作数
package a2;
public class Operation {
    private double _numberA = 0;
    private double _numberB = 0;

    protected double get_numberA() {
        return _numberA;
    }
    protected void set_numberA(double _numberA) {
        this._numberA = _numberA;
    }
    public double get_numberB() {
        return _numberB;
    }
    public void set_numberB(double _numberB) {
        this._numberB = _numberB;
    }

    // get the result;
    public double getResult(){
        double result = 0;
        return result;
    }
}


因为java中本身的类中成员函数就是虚函数,因此,把getResult()当成虚函数来对待;

2. 创建加法的操作子类

package a2;

public class OperationAdd extends Operation{
    // Java中其实没有虚函数的概念,它的普通函数就相当于C++的虚函数,
    // 动态绑定是Java的默认行为。
    // 如果Java中不希望某个函数具有虚函数特性,可以加上final关键字变成非虚函数
    @Override
    public double getResult(){
        double result = get_numberA() + get_numberB();
        return result;
    }
}


3 . 创建减法的操作子类

package a2;

public class OperationSub extends Operation{
    @Override
    public double getResult(){
        double result = get_numberA() - get_numberB();
        return result;
    }
}


4、 创建工厂

传递的参数为字符串,因为来自客户端的参数只能够为字符串的格式;

package a2;

public class OperationFactory {
    public static Operation createOperation(String operateString){
        Operation oper = null;
        // 防止不必要的实例化,使用工厂模式。
        switch (operateString) {
        case "+":
            oper = new OperationAdd();
            break;
        case "-":
            oper = new OperationSub();
            break;
        default:
            break;
        }
        return oper;
    }
}


5、 创建客户端代码

package a2;

import java.util.Scanner;

public class Calculator {
    public static void main(String[] args) {
        System.out.println("Please Type in two values:");
        Scanner sc = new Scanner(System.in);
        double _numberA = sc.nextDouble();
        double _numberB = sc.nextDouble();
        System.out.println("Which operation you want to do?");
        String operatorString = sc.next();
        Operation oper = OperationFactory.createOperation(operatorString);
        oper.set_numberA(_numberA);
        oper.set_numberB(_numberB);
        double _result = oper.getResult();
        System.out.println("Result is: " + _result);
    }
}


6、 如何想增加一个运算操作应该怎么办呢?

创建一个新的子类:OperationMul

package a2;

public class OperationMul extends Operation{
    @Override
    public double getResult(){
        double result = get_numberA() * get_numberB();
        return result;
    }
}


在工厂中加入新的操作指令:

case "*":
        oper = new OperationMul();
        break;


那么就可以直接在客户端进行调用了。

4. 简单分析




继承和创建关系
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: