介紹
組合模式(Composite Pattern) 也稱為部分-整體模式(Part-Whole Pattern) 結構型設計模式之一
組合模式將一組相似的對象看作一個對象處理,并根據一個樹狀接口來組合對象,然后提供一個統一的方法去訪問相應的對象,以此忽略掉對象與對象集合之間的差別。
組合模式中將一個擁有分支的節點稱之為枝干節點,位于樹狀結構頂部的枝干結構比較特殊,我們稱為根結構件,沒有分支的結構,稱之為葉子構件
定義
將對象組合成樹形結構以表示 “部分-整體” 的層次結構,使得用戶對單個對象和組合對象的使用具有一致性。
使用場景
- 表示對象的部分-整體層次結構時
- 從一個整體中能夠獨立出部分模塊或功能的場景
角色介紹
Component 抽象根節點,為組合中對象聲明接口,適當情況下,實現所有類共有接口的缺省行為。聲明一個接口用于訪問和管理 Component 的子節點,可在遞歸結構中定義一個接口,用于訪問一個父節點,并在合適的情況下實現它。
Composite 具體枝干節點,定義有子節點的那些枝干節點的行為,存儲子節點,實現 Component 接口中定義的方法
Left 在組合中表示葉子節點對象,葉子節點沒有子節點,在組合中定義節點對象的行為
Client 通過 Component 接口操縱組合節點的對象
將組合所使用的的方法定義在抽象類的方式稱為透明的組合模式,而上面所說的組合模式稱為安全的組合模式,透明組合模式中不管是葉子節點還是枝干節點都有著相同的結構,那意味著我們無法通過 getChilder 方法得到子節點的類型(安全的組合模式中葉子節點沒有 getchilder 方法),而必須通過內部進行判斷
實例
文件夾的管理,文件夾中可以存在文件夾和文件,抽象為組合模式
Android 開發中,目錄選擇器 DirSelector 會使用到組合模式
Android 源碼中的組合模式
View 和 ViewGroup 的嵌套組合就是安全的組合模式,只有 ViewGroup 才可以嵌套 View。
總結
Android 開發過程中組合模式適用于對一些界面 UI 的架構設計上。這部分代碼絕大多數情況會由程序語言提供。
優點
組合模式可以清楚地定義分層次的復雜對象,表示對象的全部或部分層次,它讓高層模塊忽略了層次的差異,方便對整個層次結構進行控制。
高層模塊可以一致地使用一個組合結構或其中單個對象,不必關心處理的是單個對象還是整個組合結構,簡化了高層模塊的代碼
在組合模式中增加新的枝干構件和葉子構件都很方便,無須對現有的類庫進行任何修改,符號“開閉原則”
組合模式為樹形結構的面向對象實例提供了一種靈活的解決方案,通過葉子對象和枝干對象的遞歸組合,可以形成復雜的樹形結構,但對樹形結構的控制卻非常簡單
缺點
在新增構件時不好對枝干中的構件類型進行限制,不能依賴類型系統來施加約束,因為在大多數情況下,它們都來自于相同的抽象層,此時,必須在運行時進行類型檢查來實現,這個實現過程比較復雜。