面向控制檯的計算器一java
package com.test.java.features1; import java.util.Scanner; /** * 計算器類 */ public class ComputingCounter { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("輸入 stop 關閉計算器"); while (true) { System.out.println("請輸入一個數"); String number = scanner.nextLine(); if (number.equals("stop")) { break;} System.out.println("請輸入一個運算符號"); String symbol = scanner.nextLine(); if (number.equals("stop")) { break;} System.out.println("請輸入一個數"); String number2 = scanner.nextLine(); if (number.equals("stop")) { break;} compute(Double.parseDouble(number), Double.parseDouble(number2), symbol); } scanner.close(); } private static void compute(double number, double number2, String symbol) { switch (symbol) { case "+": System.out.println((number + number2)); break; case "-": System.out.println((number - number2)); break; case "*": System.out.println((number * number2)); break; case "/": System.out.println((number / number2)); break; } } }
代碼都寫在了一個main方法裏,這是面向過程編程。算法
面向控制檯的計算器二編程
假如之後需求發生變化,須要寫一個面向windows的計算器,計算器一的代碼複用性不高;
因此,咱們把計算器一的代碼封裝爲兩部分——Client和Opration;Client只負責輸入輸出,Opration負責後臺計算。
這樣,若是真的需求變化,要求寫一個面向windows的計算器,Opration部分的代碼徹底是能夠被複用的。windows
package com.test.java.features2; import com.test.java.features2.Opration; import java.util.Scanner; public class Client { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("輸入 stop 關閉計算器"); while (true) { System.out.println("請輸入一個數"); String number = scanner.nextLine(); if (number.equals("stop")) { break;} System.out.println("請輸入一個運算符號"); String symbol = scanner.nextLine(); if (number.equals("stop")) { break;} System.out.println("請輸入一個數"); String number2 = scanner.nextLine(); if (number.equals("stop")) { break;} Opration.compute(Double.parseDouble(number), Double.parseDouble(number2), symbol); } scanner.close(); } }
package com.test.java.features2; public class Opration { public static void compute(double number, double number2, String symbol) { switch (symbol) { case "+": System.out.println((number + number2)); break; case "-": System.out.println((number - number2)); break; case "*": System.out.println((number * number2)); break; case "/": System.out.println((number / number2)); } } }
面向控制檯的計算器三ide
如今咱們只支持加、減、乘、除,可是之後可能須要擴展其它的運算,好比x的y次方。
因此把可能發生變化的部分再次封裝,分別封裝爲加法類、減法類、乘法類、除法類,並讓它們共同繼承Opration類,也就是定義了一個算法族;並使用簡單工廠模式建立具體的類而返回抽象類型(多態)spa
package com.test.java.features3; import java.util.Scanner; public class Client { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("輸入 stop 關閉計算器"); while (true) { System.out.println("請輸入一個數"); String number = scanner.nextLine(); if (number.equals("stop")) { break;} System.out.println("請輸入一個運算符號"); String symbol = scanner.nextLine(); if (number.equals("stop")) { break;} System.out.println("請輸入一個數"); String number2 = scanner.nextLine(); if (number.equals("stop")) { break;} Opration.passOn(Double.parseDouble(number), Double.parseDouble(number2), symbol); } scanner.close(); } }
package com.test.java.features3; public abstract class Opration { public static void passOn(double number, double number2, String symbol) { Opration opratoin = OprationFactory.getOpratoin(symbol); opratoin.compute(number, number2); } public abstract void compute(double number, double number2); }
package com.test.java.features3; public class Add extends Opration { @Override public void compute(double number, double number2) { System.out.println((number + number2)); } }
package com.test.java.features3; public class Sub extends Opration{ @Override public void compute(double number, double number2) { System.out.println((number - number2)); } }
package com.test.java.features3; public class Multiply extends Opration { @Override public void compute(double number, double number2) { System.out.println((number * number2)); } }
package com.test.java.features3; public class Divide extends Opration { @Override public void compute(double number, double number2) { System.out.println((number / number2)); } }
package com.test.java.features3; public class OprationFactory { public static Opration getOpratoin(String symbol) { switch (symbol) { case "+": return new Add(); case "-": return new Sub(); case "*": return new Multiply(); case "/": return new Divide(); } return null; } }
總結:面向對象三大特徵,封裝性、繼承性、多態性。有利於程序的複用性、可擴展性、維護性。code