- 首先在不通過設計模式,實現簡單計算器程序,簡單代碼如下:
package httpclientutilmaster.httpclientutilmaster.countnumber; import java.util.Scanner; /** * @ClassName MainClass * @Description TODO * @Author Feng * @Date 2019/3/25 13:49 * @Version 1.0 **/ public class MainClass { public static void main(String[] args) { //在不通過設計模式,實現簡單計算器程序 // 1、接受控制台輸入 System.out.println("*****計算器程序*****"); System.out.println("輸入第一個操作數"); Scanner scanner = new Scanner(System.in); String strNum1 = scanner.nextLine(); System.out.println("輸入運算符"); String opr = scanner.nextLine(); System.out.println("輸入第二個操作數"); String strNum2 = scanner.nextLine(); double result = 0; // 2、進行運算 if ("+".equals(opr)){ result = Double.parseDouble(strNum1) + Double.parseDouble(strNum2); }else if ("-".equals(opr)){ result = Double.parseDouble(strNum1) - Double.parseDouble(strNum2); }else if ("*".equals(opr)){ result = Double.parseDouble(strNum1) * Double.parseDouble(strNum2); }else if ("/".equals(opr)){ result = Double.parseDouble(strNum1) / Double.parseDouble(strNum2); } // 3、返回結果 System.out.println(strNum1 + opr + strNum2 + "=" + result); } }
運行結果:*****計算器程序*****
輸入第一個操作數
5
輸入運算符
*
輸入第二個操作數
6
5*6=30.0 - 由於除法運算中,分母不能為零。簡單優化后的代碼如下:
public class MainClass { public static void main(String[] args) { //在不通過設計模式,實現簡單計算器程序 // 1、接受控制台輸入 System.out.println("*****計算器程序*****"); System.out.println("輸入第一個操作數"); Scanner scanner = new Scanner(System.in); String strNum1 = scanner.nextLine(); System.out.println("輸入運算符"); String opr = scanner.nextLine(); System.out.println("輸入第二個操作數"); String strNum2 = scanner.nextLine(); double result = 0; // 2、進行運算 if ("+".equals(opr)){ result = Double.parseDouble(strNum1) + Double.parseDouble(strNum2); }else if ("-".equals(opr)){ result = Double.parseDouble(strNum1) - Double.parseDouble(strNum2); }else if ("*".equals(opr)){ result = Double.parseDouble(strNum1) * Double.parseDouble(strNum2); }else if ("/".equals(opr)){ if (Double.parseDouble(strNum2) == 0d){ throw new java.lang.ArithmeticException("分母不能為零"); }else{ result = Double.parseDouble(strNum1) / Double.parseDouble(strNum2);} } // 3、返回結果 System.out.println(strNum1 + opr + strNum2 + "=" + result); } }
- 以上的代碼有哪些缺陷
缺點:完全的面向過程設計,缺少代碼重用。(比如,增加求平方等等) - 用面向對象思想實現
package httpclientutilmaster.httpclientutilmaster.countnumber; /** * @ClassName Operation * @Description TODO * @Author Feng * @Date 2019/3/25 14:53 **/ public abstract class Operation { private double num1; private double num2; public double getNum1() { return num1; } public void setNum1(double num1) { this.num1 = num1; } public double getNum2() { return num2; } public void setNum2(double num2) { this.num2 = num2; } public abstract double getResult(); }
package httpclientutilmaster.httpclientutilmaster.countnumber; /** * @ClassName AddOperation * @Description TODO * @Author Feng * @Date 2019/3/25 14:55 **/ public class AddOperation extends Operation { @Override public double getResult() { double result = this.getNum1() + this.getNum2(); return result; } }
package httpclientutilmaster.httpclientutilmaster.countnumber; import java.util.Scanner; /** * @ClassName MainClass * @Description TODO * @Author Feng * @Date 2019/3/25 13:49 * @Version 1.0 **/ public class MainClass { public static void main(String[] args) { //在不通過設計模式,實現簡單計算器程序 // 1、接受控制台輸入 System.out.println("*****計算器程序*****"); System.out.println("輸入第一個操作數"); Scanner scanner = new Scanner(System.in); String strNum1 = scanner.nextLine(); System.out.println("輸入運算符"); String opr = scanner.nextLine(); System.out.println("輸入第二個操作數"); String strNum2 = scanner.nextLine(); double result = 0; double num1 = Double.parseDouble(strNum1); double num2 = Double.parseDouble(strNum2); // 2、進行運算,大家可以看到加法運算中,還需要知道,new實例化一個AddOperation,我們不希望使用實例化,那么就用工廠模式來實現。 if ("+".equals(opr)){ Operation addOperation = new AddOperation(); addOperation.setNum1(num1); addOperation.setNum2(num2); result = addOperation.getResult(); }else if ("-".equals(opr)){ result = Double.parseDouble(strNum1) - Double.parseDouble(strNum2); }else if ("*".equals(opr)){ result = Double.parseDouble(strNum1) * Double.parseDouble(strNum2); }else if ("/".equals(opr)){ if (Double.parseDouble(strNum2) == 0d){ throw new java.lang.ArithmeticException("分母不能為零"); }else{ result = Double.parseDouble(strNum1) / Double.parseDouble(strNum2);} } // 3、返回結果 System.out.println(strNum1 + opr + strNum2 + "=" + result); } }
- 簡單工廠模式實現
package httpclientutilmaster.httpclientutilmaster.countnumber; /** * @ClassName OperationFactory * @Description TODO * @Author Feng * @Date 2019/3/25 15:58 **/ public class OperationFactory { public static Operation getOperation(String opr){ if ("+".equals(opr)){ return new AddOperation(); } return null; } }
package httpclientutilmaster.httpclientutilmaster.countnumber; import java.util.Scanner; /** * @ClassName MainClass * @Description TODO * @Author Feng * @Date 2019/3/25 13:49 * @Version 1.0 **/ public class MainClass { public static void main(String[] args) { //在不通過設計模式,實現簡單計算器程序 // 1、接受控制台輸入 System.out.println("*****計算器程序*****"); System.out.println("輸入第一個操作數"); Scanner scanner = new Scanner(System.in); String strNum1 = scanner.nextLine(); System.out.println("輸入運算符"); String opr = scanner.nextLine(); System.out.println("輸入第二個操作數"); String strNum2 = scanner.nextLine(); double result = 0; double num1 = Double.parseDouble(strNum1); double num2 = Double.parseDouble(strNum2); // 2、進行運算,后續我們只需要修改工廠類,客戶端MainClass不需要任何修改了。 Operation operation = OperationFactory.getOperation(opr); operation.setNum1(num2); operation.setNum2(num1); result = operation.getResult(); // 3、返回結果 System.out.println(strNum1 + opr + strNum2 + "=" + result); } }
同理減法運算代碼:
package httpclientutilmaster.httpclientutilmaster.countnumber; /** * @ClassName SubOperation * @Description TODO * @Author Feng * @Date 2019/3/25 16:05 * 同理減法運算 **/ public class SubOperation extends Operation { @Override public double getResult() { double result = this.getNum1() - this.getNum2(); return result; } }
我們只需要修改OperationFactory判斷邏輯即可:
public class OperationFactory { public static Operation getOperation(String opr){ if ("+".equals(opr)){ return new AddOperation(); }else if ("-".equals(opr)){ return new SubOperation(); } return null; } }
- OperationFactory實際上是一個具體的實現類。我們可以優化如下。
// OperationFactory修改為接口
public interface OperationFactory {public Operation getOperation(String opr); }
package httpclientutilmaster.httpclientutilmaster.countnumber; /** * @ClassName AddOperationFactory * @Description TODO * @Author Feng * @Date 2019/3/25 16:36 **/ public class AddOperationFactory implements OperationFactory { @Override public Operation getOperation() { return new AddOperation(); } }
package httpclientutilmaster.httpclientutilmaster.countnumber; import java.util.Scanner; /** * @ClassName MainClass * @Description TODO * @Author Feng * @Date 2019/3/25 13:49 * @Version 1.0 **/ public class MainClass { public static void main(String[] args) { //在不通過設計模式,實現簡單計算器程序 // 1、接受控制台輸入 System.out.println("*****計算器程序*****"); System.out.println("輸入第一個操作數"); Scanner scanner = new Scanner(System.in); String strNum1 = scanner.nextLine(); System.out.println("輸入運算符"); String opr = scanner.nextLine(); System.out.println("輸入第二個操作數"); String strNum2 = scanner.nextLine(); double result = 0; double num1 = Double.parseDouble(strNum1); double num2 = Double.parseDouble(strNum2); // 2、進行運算,好處在於增加其他運算規則的情況下,我們只需要增加相應的AddOperationFactory/AddOperation if ("+".equals(opr)){ AddOperationFactory addOperationFactory = new AddOperationFactory(); Operation operation = addOperationFactory.getOperation(); operation.setNum1(num1); operation.setNum2(num2); result = operation.getResult(); } // 3、返回結果 System.out.println(strNum1 + opr + strNum2 + "=" + result); } }