首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

組合優於繼承:運行時行為動態切換的 Transmogrify 模式

     編輯:Java 相關知識

繼承的侷限性

繼承在編譯期確定類型與行為,運行期無法改變。濫用繼承會導致類層次膨脹、耦合加深。

組合的靈活性:State 模式雛形

通過持有介面引用,運行期動態替換實現對象,實現行為熱插拔:

interface Actor { void act(); }
class HappyActor implements Actor { public void act() { println("HappyActor"); } }
class SadActor implements Actor { public void act() { println("SadActor"); } }

class Stage {
    Actor a = new HappyActor(); // 初始狀態
    void change() { a = new SadActor(); } // 運行期切換行為
    void go() { a.act(); }
}

Stage 不繼承 Actor,而是組合一個 Actor 引用。調用 change() 即可在運行期將行為從 Happy 切換為 Sad,無需重新編譯、無需創建新子類。

設計準則

用繼承表達「行為差異」,用成員變量表達「狀態變化」。
上例中:HappyActor/SadActor 繼承表達 act() 差異;Stage 組合表達狀態變化,狀態改變同時帶來行為改變。

何時選擇組合?

  • 需運行期動態切換行為
  • 類之間無明顯「是一個」關係
  • 避免繼承層次過深導致脆弱基類問題

啟動設計時,首選組合;只有確認需要多態與向上轉型時,才引入繼承。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved