1. 程式人生 > >大戰設計模式【13】—— 組合模式

大戰設計模式【13】—— 組合模式

component 二叉樹 whole 全部 通過 節點 十分 基礎 進行

組合模式(Composite)

設計模式使用的例子https://github.com/LinkinStars/DesignPatternsAllExample

一、定義

組合多個對象形成樹形結構以表示具有“整體-部分”關系的層次結構。

組合模式對單個對象(即葉子對象)和組合對象(即容器對象)的使用具有一致性.

組合模式又可以稱為“部分-整體”(Part-Whole)模式,它是一種對象結構型模式。 

二、結構

Component(抽象構件):它是接口或抽象類,為葉子構件和容器構件對象聲明接口,在該角色中可以包含所有子類共有行為的聲明和實現。

在抽象構件中定義了訪問及管理它的子構件的方法,例如增加子構件、刪除子構件、獲取子構件等。

Leaf(葉子構件):它在組合模式中表示葉子結點對象,葉子結點沒有子節點,它實現了在抽象構件中定義的行為。

Composite(容器構件):它在組合模式中表示容器節點對象,容器節點包含子節點,其子節點可以使葉子結點,也可以是容器節點,它提供一個集合用於存儲子節點,實現了在抽象構件中定義的行為。

三、優點

可以清楚地定義分層次的復雜對象,表示對象的全部或部分層次,使客戶忽略了層次的差異,方便對整個層次結構進行控制。

增加新的容器構件和葉子構件都十分方便,無需對現有類庫代碼進行任何修改,符合開閉原則。

為樹形結構的面向對象實現提供了靈活地解決方案,可以形成復雜的樹形結構,但對樹形結構的控制卻很簡單。

四、缺點

增加新構件時很難對容器中的構建類型進行限制。

五、應用場景

在具有整體和部分的層次結構中,希望通過一種方式忽略整體與部分的差異,客戶端可以一致地對待他們。

在一個使用面向對象語言開發的系統中需要處理一個樹形結構。

六、個人總結

1、如果你對數據結構中的樹形結構比較了解,更進一步說你可能知道各種二叉樹以及遍歷方式,那麽這個設計模式就是這個數據結構的一個實現。

2、組合模式簡單的說,就是將幾個不同的需要被操作的對象,組合在一起,這樣就不需要分別進行操作,一起操作就可以了。

3、這個模式常常與叠代器模式相討論,因為叠代器模式最後產生的對象我們需要進行遍歷的時候我們還是需要一個個分別操作

而組合模式正好解決了這個問題,例子中也是在叠代器模式的基礎上進行了改進,在實際中不會如此復雜,但思想應該是一樣的。

4、這個模式是樹形數據結構的實現,所以有很多變種,你可以根據自己的需要對節點進行調整即可。

例子中沒有使用葉子構建,因為我這裏為了方便就直接使用容器構件作為最後的節點。

組合模式的增加,刪除等操作都是可以被設計的,例子中僅僅實現遍歷的方法。

而且遍歷的方式也有不同的順序,這裏就不多做說明了,這裏主要用的是樹的遍歷次序,參考數據結構的支持即可。

參考博客:http://www.cnblogs.com/edisonchou/p/7082904.html

大戰設計模式【13】—— 組合模式