1.提出問題:設計一個簡單的計算器功能拧略。
原始版本:
定義減法
private final static String ADD = "+";
public static void main(String[] args) {
? ? System.out.println("請輸入數字A");
? ? Scanner scannerA = new Scanner(System.in);
? ? double numberA = scannerA.nextDouble();
? ? System.out.println("請輸入數字B");
? ? Scanner scannerB = new Scanner(System.in);
? ? double numberB = scannerB.nextDouble();
? ? System.out.println("請輸入運算符C");
? ? Scanner scannerC = new Scanner(System.in);
? ? String operator = scannerC.next();
? ? if (ADD.equalsIgnoreCase(operator)) {
? ? ? ? System.out.println(numberA + numberB);
? ? }
}
這樣就實現了一個加法計算器芦岂,那么問題來了,如果我要為計算器新增減法功能呢垫蛆?有些同學就說新增一個if判斷不就好了禽最?那么問題又來了,我有N個類都用了計算器我們是不是就要去N個地方去修改袱饭?是的川无,那么我們很容易就可以想到利用封裝的思想將計算邏輯與控制臺輸入給分開,改造好的運算邏輯方法虑乖,如下:
/**
* 這里用到了封裝思想懦趋,封裝了運算方法,將輸入和運算邏輯分開了
* @param numberA 輸入的第一個值
* @param numberB 輸入的第二個值
* @param operator 運算符
* @author WangHan
* @date 2019/1/21 16:15
*/
private static double operation(double numberA, double numberB, String operator) {
? ? if (ADD.equalsIgnoreCase(operator)) {
? ? ? ? return numberA + numberB;
? ? } else if (SUBTRACT.equalsIgnoreCase(operator)) {
? ? ? ? return numberA - numberB;
? ? }else {
? ? ? ? return 0;
}
}
這樣盡管我有N多個地方輸入計算值和計算符號,我也可以都調用這一個operation方法來計算結果!這就是封裝的思想了船老。
繼續(xù):
如果此時要增加兩個運算符*和/,需要修改operation方法讓加減法也參與了重新編譯蔓涧,如果不小心將加減法改錯那么就是坑爹!
增加需求绒障,盡可能的擴展的來解決問題而不是去修改原來的代碼
此時我們新增一個算法的父類Operation:
@Data
public class Operation {
? ? public double numberA = 0;
? ? public double numberB = 0;
? ? public double getResult() {
? ? ? ? return 0;
}
? ? public static class OperationAdd extends Operation {
? ? ? ? /**
? ? ? ? * 重寫getResult方法
? ? ? ? */
? ? ? ? @Override
? ? ? ? public double getResult() {
? ? ? ? ? ? return numberA + numberB;
}
}
? ? public static class OperationSub extends Operation {
? ? ? ? /**
? ? ? ? * 重寫getResult方法
? ? ? ? */
? ? ? ? @Override
? ? ? ? public double getResult() {
? ? ? ? ? ? return numberA - numberB;
}
}
}
并且新增兩個子類OperationAdd 和OperationSub 去繼承Operation分別實現加減算法。
新增一個工廠類OperationFactory:
class OperationFactory {
? ? static Operation createOperation(double numberA, double numberB, String operator) {
? ? ? ? Operation operation;
? ? ? ? switch (operator) {
? ? ? ? ? ? case "+":
? ? ? ? ? ? ? ? operation = new Operation.OperationAdd();
? ? ? ? ? ? ? ? operation.setNumberA(numberA);
? ? ? ? ? ? ? ? operation.setNumberB(numberB);
? ? ? ? ? ? ? ? return operation;
? ? ? ? ? ? case "-":
? ? ? ? ? ? ? ? operation = new Operation.OperationSub();
? ? ? ? ? ? ? ? operation.setNumberA(numberA);
? ? ? ? ? ? ? ? operation.setNumberB(numberB);
? ? ? ? ? ? ? ? return operation;
? ? ? ? ? ? default:
? ? ? ? ? ? ? ? return null;
}
}
}
通過判斷運算符去確定我要實例化那個算法的子類就可以了
這樣在實現計算器功能的時候就用到了簡單工廠模式,我們調用工廠類去實例化算法:
Optional<Operation> optional = Optional.ofNullable(OperationFactory.createOperation(numberA, numberB, operator));
optional.ifPresent(operation ->System.out.println("第三版計算結果:" + operation.getResult()));
學習到這里簡答做個筆記遂跟!