組合模式將一組相似的對象看做一個對象來處理,并且根據一個樹狀結構來組合對象。然后提供一個統一的方法去訪問相應的對象。以此忽略掉對象與對象集合之間的差別。
定義:
將對象組合成樹形結構以表示“部分-整體”的層次結構,使得用戶對單個對象和組合對象的使用具有一致性。
使用場景:
表示對象的部分-整體層次結構時
從一個整體中能夠獨立出部分模塊或功能的場景
實現,有兩種組合模式:安全組合模式和透明組合模式
安全組合模式:
定義一個抽象根節點 Component,有一個抽象方法doSomething。
枝干對象Composite去繼承Component,并且有一個成員變量List<Component>,還有addChild和removeChild,getChild方法。來往List中設置枝干/子葉節點(添加、刪除、或者獲取)。
當我們調用doSomething的時候,就去迭代List,然后調用每一個元素的doSomething方法。
根端的子葉對象leaf也是繼承Component,但是他由于沒有子節點,沒有list,所以不用有addChild,getChild或者removeChild方法,只有一個doSomething方法,方法進行具體操作。
客戶端創建枝干或者子葉對象,添加設置好樹狀結構后,調用rootObject.doSomething就能迭代調用到每一個對象的doSomething方法了。
透明組合模式
所有的方法都定義在抽象類Commponent中(addChild,removeChild,getChild方法),枝干節點的這些方法對List進行增刪,子葉節點拋出異常。枝干節點和子葉節點擁有同樣的結構。
Android中的組合模式
ViewGroup和View就是一個很經典的安全組合模式
ViewGroup是繼承View的,同時又實現了接口ViewManager
ViewManager中有addView、removeView和updateViewLayout
顯然構成了一個組合模式
優點:
1.可以清楚的定義分層次的復雜對象,表示對象的全部或部分層次
2.讓高層的模塊忽略了層次的差異,調用不用關心是當對象還是組合。
3.添加節點很方便,符合開閉原則。
缺點:
新增節點時不好對枝干中的結構類型進行限制,必須進行類型檢查,實現起來較為復雜。