【设计模式】面向对象 - 多态 ( 面向对象 3 要素 | 多态 提升 程序扩展性 | 多态示例 )
文章目錄
- 一、面向對象 3 要素
- 二、多態 ( 提升程序擴展性 )
- 三、不使用多態示例
- 四、使用多態示例
- 總結
一、面向對象 3 要素
面向對象 333 要素 :
封裝 : 解決 安全性 問題 ; 通過 private , protected , public 修飾方法 , 變量 , 以保證代碼安全性 ;
繼承 : 解決 代碼重用 問題 ; 子類繼承父類 ,
多態 : 解決 程序擴展 問題 ;
二、多態 ( 提升程序擴展性 )
多態有 333 種表現 :
① 子類 重寫 父類方法 ;
② 相同方法名 不同參數 的 方法 重載 ;
③ 父類引用 指向 子類對象 ;
面向對象編程時 , 建議 面向接口 編程 ;
如果不使用多態 , 如果 添加新的類 時 , 就需要 修改業務邏輯 , 明顯 違反了開閉原則 ;
面向對象中 , 多態發生的條件 :
- 子類 繼承 ( 實現 ) 父類 ;
- 父類引用 指向 子類對象 ;
- 子類 重寫 父類方法 ;
使用多態后 , JVM 在運行階段 , 才知道要執行哪個類的方法 ;
三、不使用多態示例
業務場景 : 飛行器飛行 , 飛行器有 直升機 和 運輸機 , 每個飛行器都有起飛和降落方法 ;
直升機類 :
public class Helicopter {public void takeOff() {System.out.println("直升飛機 起飛");}public void land() {System.out.println("直升飛機 降落");} }運輸機類 :
public class TransportPlane {public void takeOff() {System.out.println("運輸機 起飛");}public void land() {System.out.println("運輸機 降落");} }客戶端 : 分別為 直升機 Helicopter 和 運輸機 TransportPlane 各自定義 111 個方法 ;
public class Client {public static void main(String[] args) {Client client = new Client();client.doFly();client.doFly2();}private void doFly() {Helicopter helicopter = new Helicopter();helicopter.takeOff();System.out.println("飛行");helicopter.land();}private void doFly2() {TransportPlane transportPlane = new TransportPlane();transportPlane.takeOff();System.out.println("飛行");transportPlane.land();} }運行結果 :
上述示例中 , 如果要添加新的飛行器 , 戰斗機 , 就要定義新的 客戶端 Client 方法 , 修改客戶端的業務邏輯 ;
這顯然違背了 面向對象 777 大設計原則 中的 " 開閉原則 " ;
增加的新的戰斗機類 :
public class Fighter {public void takeOff() {System.out.println("戰斗機 起飛");}public void land() {System.out.println("戰斗機 降落");} }客戶端修改后的結果 :
public class Client {public static void main(String[] args) {Client client = new Client();client.doFly();client.doFly2();client.doFly3();}private void doFly() {Helicopter helicopter = new Helicopter();helicopter.takeOff();System.out.println("飛行");helicopter.land();}private void doFly2() {TransportPlane transportPlane = new TransportPlane();transportPlane.takeOff();System.out.println("飛行");transportPlane.land();}private void doFly3() {Fighter fighter = new Fighter();fighter.takeOff();System.out.println("飛行");fighter.land();} }執行結果 :
四、使用多態示例
飛行器接口 :
public interface Aircraft {public void takeOff();public void land(); }直升飛機 :
public class Helicopter implements Aircraft {@Overridepublic void takeOff() {System.out.println("直升飛機 起飛");}@Overridepublic void land() {System.out.println("直升飛機 降落");} }運輸機 :
public class TransportPlane implements Aircraft {@Overridepublic void takeOff() {System.out.println("運輸機 起飛");}@Overridepublic void land() {System.out.println("運輸機 降落");} }客戶端類 :
public class Client {public static void main(String[] args) {Client client = new Client();Aircraft aircraft1 = new Helicopter();Aircraft aircraft2 = new TransportPlane();client.doFly(aircraft1);client.doFly(aircraft2);}private void doFly(Aircraft aircraft) {aircraft.takeOff();System.out.println("飛行");aircraft.land();} }執行結果 :
添加戰斗機類 , Client 中的相關方法不用修改 ;
添加的戰斗機類 :
public class Fighter implements Aircraft {@Overridepublic void takeOff() {System.out.println("戰斗機 起飛");}@Overridepublic void land() {System.out.println("戰斗機 降落");} }修改后的客戶端類 :
public class Client {public static void main(String[] args) {Client client = new Client();Aircraft aircraft1 = new Helicopter();Aircraft aircraft2 = new TransportPlane();Aircraft aircraft3 = new Fighter();client.doFly(aircraft1);client.doFly(aircraft2);client.doFly(aircraft3);}private void doFly(Aircraft aircraft) {aircraft.takeOff();System.out.println("飛行");aircraft.land();} }執行結果 :
總結
多態作用 : 提升程序擴展性 ;
多態 333 種表現 : ① 子類 重寫 父類方法 ; ② 相同方法名 不同參數 的 方法 重載 ; ③ 父類引用 指向 子類對象 ;
多態發生 333 條件 : ① 子類 繼承 ( 實現 ) 父類 ; ② 父類引用 指向 子類對象 ; ③ 子類 重寫 父類方法 ;
總結
以上是生活随笔為你收集整理的【设计模式】面向对象 - 多态 ( 面向对象 3 要素 | 多态 提升 程序扩展性 | 多态示例 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Binder 机制】Native 层
- 下一篇: 【设计模式】代理模式 ( 动态代理使用流