面向對象程序設計之封裝性、繼承性、多態性

面向控制檯的計算器一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; } } }
View Code

代碼都寫在了一個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(); } }
Client.java
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)); } } }
Opration.java

面向控制檯的計算器三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(); } }
Client.java
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); }
Opration.java
package com.test.java.features3; public class Add extends Opration { @Override public void compute(double number, double number2) { System.out.println((number + number2)); } }
Add.java
package com.test.java.features3; public class Sub extends Opration{ @Override public void compute(double number, double number2) { System.out.println((number - number2)); } }
Sub.java
package com.test.java.features3; public class Multiply extends Opration { @Override public void compute(double number, double number2) { System.out.println((number * number2)); } }
Multiply.java
package com.test.java.features3; public class Divide extends Opration { @Override public void compute(double number, double number2) { System.out.println((number / number2)); } }
Divide.java
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; } }
OprationFactory.java

總結:面向對象三大特徵,封裝性、繼承性、多態性。有利於程序的複用性、可擴展性、維護性。code

相關文章
相關標籤/搜索