23种设计模式之组合模式
組合模式的定義
定義: 將對象組合成樹形結(jié)構(gòu)以表示 "部分-整體" 的層次結(jié)構(gòu),使得用戶對單個對象和組合對象的使用具有一致性.
通俗的說, 就是實現(xiàn)了樹形結(jié)構(gòu)
通用類圖如下:
?
其中的三個角色如下:
抽象構(gòu)件角色代碼:
?
樹枝構(gòu)件代碼:
?
葉子構(gòu)件代碼:
?
場景類代碼:
?
組合模式的應(yīng)用
組合模式的優(yōu)點:
組合模式的缺點:
我們在使用的時候, 樹葉和樹枝的定義直接使用了實現(xiàn)類, 這在面向接口編程上是很不恰當(dāng)?shù)? 與依賴倒置原則沖突, 限制了接口的影響范圍
組合模式的使用場景:
只要是樹形結(jié)構(gòu), 就要考慮使用組合模式, 只要是要體現(xiàn)局部和整體的關(guān)系的時候,而且這種關(guān)系還可能比較深, 應(yīng)該考慮組合模式
組合模式的擴展
1.真實的組合模式
在上邊的例子中, Clien 中進行了樹的組裝, 而在實際項目中, 數(shù)據(jù)通常在數(shù)據(jù)庫中, 我們直接從數(shù)據(jù)庫將數(shù)據(jù)讀取放到樹上就可以了
2.透明的組合模式
組合模式有兩種實現(xiàn): 透明模式和安全模式. 上面的實現(xiàn)就是安全模式, 透明模式的類圖如下:
?
透明模式就是把用來組合使用的方法放到抽象類中, 通過判斷getChild() 的返回值確定是葉子節(jié)點還是樹枝節(jié)點, 在 Leaf 中實現(xiàn) add等方法要拋出異常, 如果處理不當(dāng), 會在運行期出現(xiàn)問題
在透明模式下, 遍歷整個樹形結(jié)構(gòu)是比較容易的, 不用進行強制類型轉(zhuǎn)換.
透明模式的好處就是它基本遵循了依賴倒置原則, 方便系統(tǒng)擴展
3.組合模式的遍歷
有的時候不光要從上向下遍歷, 還要從下往上遍歷, 也就是通過子節(jié)點要找到他的父節(jié)點, 這時就要在抽象構(gòu)件角色中添加 getParent 方法, 也就是在每個節(jié)點都增加一個父節(jié)點對象
總結(jié)
以上是生活随笔為你收集整理的23种设计模式之组合模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hbase/thrift/go连接失败
- 下一篇: 23种设计模式之桥梁模式