組合模式

簡介

組合模式也叫做部分整體模式,它將一組相似的對象看作一個對象處理,並且根據一個樹狀結構來組合對象,然後提供一個統一的方法去訪問相應的對象,以此忽略對象與對象集合之間的差別。

定義

允許你將對象組成樹形結構來表現“整體/部分”的層次結構。組合能讓客戶以一致的方式來處理個別對象和對象組合。

使用場景

表示對象的部分-整體層次結構,文件夾和文件層次,公司組織結構層次等樹形結構的處理。

UML類圖

安全組合模式


這裏寫圖片描述

角色介紹:

  • Component:抽象構件,它可以是接口或抽象類,爲下面的葉子構件和容器構件對象聲明接口。包含所有子類共有的行爲和聲明的實現。
  • Leaf:葉子構件,葉子節點對象。沒有子節點,它實現了抽象構件中的行爲。對於管理子構件的方法,可以通過異常等進行處理。
  • Composite:容器構件,它表示容器節點對象,容器節點包含子節點。子節點可以是容器也可以是葉子。它實現了抽象構件中定義的行爲和管理子構件的方法。

上述的抽象方法只聲明瞭操作方法operation,葉子節點功能上面來說只要在意行爲的方法operation,而容器節點要實現方法和管理子節點方法,這樣保證了使用葉子節點的時候的安全性,不會涉及到其他和功能不想幹的方法。
弊端:從面向接口編程來說,與依賴倒置原則相違背,我們不能使葉子節點和容器節點都使用抽象構件來定義。容器構件不能使用抽象構件來定義,否則都不能管理葉子節點了。

透明組合模式


這裏寫圖片描述

這種實現組合模式我們可以看到抽象葉子和容器節點都實現了抽象構件的方法,可以通過接口編程。但是壞處我們很容易看到,葉子節點實現了不必要的add,remove,getChild方法。葉子節點實現那三個方法就拋出異常。

簡單實現

我們以透明組合模式來實現打印文件名功能。
查看

Android源碼使用組合模式

Android 的View和ViewGroup是我們接觸最多的了,View好比抽象組件,具體實現子類爲葉子組件,ViewGroup爲容器組件。


這裏寫圖片描述

總結

  • 優點:

    • 可以清楚的定義分層次的複雜對象,表示對象的全部或部分層次,它讓客戶端忽略了層次的差異,方便對整個層次結構進行控制。
    • 客戶端可以一致地使用一個組合結構或其中單個對象,不必關心處理的是單個對象還是整個組合結構,簡化了客戶端代碼。
    • 在組合模式中增加新的容器構件和葉子構件都很方便,無須對現有類庫進行任何修改,符合“開閉原則”。
    • 組合模式爲樹形結構的面向對象實現提供了一種靈活的解決方案,通過葉子對象和容器對象的遞歸組合,可以形成複雜的樹形結構,但對樹形結構的控制卻非常簡單。
  • 缺點:

    • 在增加新構件時很難對容器中的構件類型進行限制。有時候我們希望一個容器中只能有某些特定類型的對象,例如在某個文件夾中只能包含文本文件,使用組合模式時,不能依賴類型系統來施加這些約束,因爲它們都來自於相同的抽象層,在這種情況下,必須通過在運行時進行類型檢查來實現,這個實現過程較爲複雜。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章