【设计模式】面向对象 - 多态 ( 面向对象 3 要素 | 多态 提升 程序扩展性 | 多态示例 )
文章目錄
- 一、面向?qū)ο?3 要素
- 二、多態(tài) ( 提升程序擴(kuò)展性 )
- 三、不使用多態(tài)示例
- 四、使用多態(tài)示例
- 總結(jié)
一、面向?qū)ο?3 要素
面向?qū)ο?333 要素 :
封裝 : 解決 安全性 問題 ; 通過 private , protected , public 修飾方法 , 變量 , 以保證代碼安全性 ;
繼承 : 解決 代碼重用 問題 ; 子類繼承父類 ,
多態(tài) : 解決 程序擴(kuò)展 問題 ;
二、多態(tài) ( 提升程序擴(kuò)展性 )
多態(tài)有 333 種表現(xiàn) :
① 子類 重寫 父類方法 ;
② 相同方法名 不同參數(shù) 的 方法 重載 ;
③ 父類引用 指向 子類對(duì)象 ;
面向?qū)ο缶幊虝r(shí) , 建議 面向接口 編程 ;
如果不使用多態(tài) , 如果 添加新的類 時(shí) , 就需要 修改業(yè)務(wù)邏輯 , 明顯 違反了開閉原則 ;
面向?qū)ο笾?, 多態(tài)發(fā)生的條件 :
- 子類 繼承 ( 實(shí)現(xiàn) ) 父類 ;
- 父類引用 指向 子類對(duì)象 ;
- 子類 重寫 父類方法 ;
使用多態(tài)后 , JVM 在運(yùn)行階段 , 才知道要執(zhí)行哪個(gè)類的方法 ;
三、不使用多態(tài)示例
業(yè)務(wù)場景 : 飛行器飛行 , 飛行器有 直升機(jī) 和 運(yùn)輸機(jī) , 每個(gè)飛行器都有起飛和降落方法 ;
直升機(jī)類 :
public class Helicopter {public void takeOff() {System.out.println("直升飛機(jī) 起飛");}public void land() {System.out.println("直升飛機(jī) 降落");} }運(yùn)輸機(jī)類 :
public class TransportPlane {public void takeOff() {System.out.println("運(yùn)輸機(jī) 起飛");}public void land() {System.out.println("運(yùn)輸機(jī) 降落");} }客戶端 : 分別為 直升機(jī) Helicopter 和 運(yùn)輸機(jī) TransportPlane 各自定義 111 個(gè)方法 ;
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();} }運(yùn)行結(jié)果 :
上述示例中 , 如果要添加新的飛行器 , 戰(zhàn)斗機(jī) , 就要定義新的 客戶端 Client 方法 , 修改客戶端的業(yè)務(wù)邏輯 ;
這顯然違背了 面向?qū)ο?777 大設(shè)計(jì)原則 中的 " 開閉原則 " ;
增加的新的戰(zhàn)斗機(jī)類 :
public class Fighter {public void takeOff() {System.out.println("戰(zhàn)斗機(jī) 起飛");}public void land() {System.out.println("戰(zhàn)斗機(jī) 降落");} }客戶端修改后的結(jié)果 :
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();} }執(zhí)行結(jié)果 :
四、使用多態(tài)示例
飛行器接口 :
public interface Aircraft {public void takeOff();public void land(); }直升飛機(jī) :
public class Helicopter implements Aircraft {@Overridepublic void takeOff() {System.out.println("直升飛機(jī) 起飛");}@Overridepublic void land() {System.out.println("直升飛機(jī) 降落");} }運(yùn)輸機(jī) :
public class TransportPlane implements Aircraft {@Overridepublic void takeOff() {System.out.println("運(yùn)輸機(jī) 起飛");}@Overridepublic void land() {System.out.println("運(yùn)輸機(jī) 降落");} }客戶端類 :
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();} }執(zhí)行結(jié)果 :
添加戰(zhàn)斗機(jī)類 , Client 中的相關(guān)方法不用修改 ;
添加的戰(zhàn)斗機(jī)類 :
public class Fighter implements Aircraft {@Overridepublic void takeOff() {System.out.println("戰(zhàn)斗機(jī) 起飛");}@Overridepublic void land() {System.out.println("戰(zhàn)斗機(jī) 降落");} }修改后的客戶端類 :
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();} }執(zhí)行結(jié)果 :
總結(jié)
多態(tài)作用 : 提升程序擴(kuò)展性 ;
多態(tài) 333 種表現(xiàn) : ① 子類 重寫 父類方法 ; ② 相同方法名 不同參數(shù) 的 方法 重載 ; ③ 父類引用 指向 子類對(duì)象 ;
多態(tài)發(fā)生 333 條件 : ① 子類 繼承 ( 實(shí)現(xiàn) ) 父類 ; ② 父類引用 指向 子類對(duì)象 ; ③ 子類 重寫 父類方法 ;
總結(jié)
以上是生活随笔為你收集整理的【设计模式】面向对象 - 多态 ( 面向对象 3 要素 | 多态 提升 程序扩展性 | 多态示例 )的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Binder 机制】Native 层
- 下一篇: 【设计模式】代理模式 ( 动态代理使用流