1. 程式人生 > >樹形結構的處理——組合模式(五)

樹形結構的處理——組合模式(五)

11.5 公司組織結構

在學習和使用組合模式時,Sunny軟體公司開發人員發現樹形結構其實隨處可見,例如Sunny公司的組織結構就是“一棵標準的樹”,如圖11-8所示:

11-8  Sunny公司組織結構圖

      在Sunny軟體公司的內部辦公系統Sunny OA系統中,有一個與公司組織結構對應的樹形選單,行政人員可以給各級單位下發通知,這些單位可以是總公司的一個部門,也可以是一個分公司,還可以是分公司的一個部門。使用者只需要選擇一個根節點即可實現通知的下發操作,而無須關心具體的實現細節。這不正是組合模式的“特長”嗎?於是Sunny公司開發人員繪製瞭如圖11-9所示結構圖:

11-9  Sunny

公司組織結構組合模式示意圖

在圖11-9中,“單位”充當了抽象構件角色,“公司”充當了容器構件角色,“研發部”、“財務部”和“人力資源部”充當了葉子構件角色。

思考

如何編碼實現圖11-9中的“公司”類?

11.6 組合模式總結

      組合模式使用面向物件的思想來實現樹形結構的構建與處理,描述瞭如何將容器物件和葉子物件進行遞迴組合,實現簡單,靈活性好。由於在軟體開發中存在大量的樹形結構,因此組合模式是一種使用頻率較高的結構型設計模式,Java SE中的AWTSwing包的設計就基於組合模式,在這些介面包中為使用者提供了大量的容器構件(如Container)和成員構件(如CheckboxButton

TextComponent等),其結構如圖11-10所示:

11-10 AWT組合模式結構示意圖

      在圖11-10中,Component類是抽象構件,CheckboxButtonTextComponent是葉子構件,而Container是容器構件,在AWT中包含的葉子構件還有很多,因為篇幅限制沒有在圖中一一列出。在一個容器構件中可以包含葉子構件,也可以繼續包含容器構件,這些葉子構件和容器構件一起組成了複雜的GUI介面。

      除此以外,在XML解析、組織結構樹處理、檔案系統設計等領域,組合模式都得到了廣泛應用。

      1. 主要優點

      組合模式的主要優點如下:

      (1)

組合模式可以清楚地定義分層次的複雜物件,表示物件的全部或部分層次,它讓客戶端忽略了層次的差異,方便對整個層次結構進行控制。

      (2) 客戶端可以一致地使用一個組合結構或其中單個物件,不必關心處理的是單個物件還是整個組合結構,簡化了客戶端程式碼。

      (3) 在組合模式中增加新的容器構件和葉子構件都很方便,無須對現有類庫進行任何修改,符合“開閉原則”。

      (4) 組合模式為樹形結構的面向物件實現提供了一種靈活的解決方案,通過葉子物件和容器物件的遞迴組合,可以形成複雜的樹形結構,但對樹形結構的控制卻非常簡單。

      2. 主要缺點

      組合模式的主要缺點如下:

      在增加新構件時很難對容器中的構件型別進行限制。有時候我們希望一個容器中只能有某些特定型別的物件,例如在某個資料夾中只能包含文字檔案,使用組合模式時,不能依賴型別系統來施加這些約束,因為它們都來自於相同的抽象層,在這種情況下,必須通過在執行時進行型別檢查來實現,這個實現過程較為複雜。

      3. 適用場景

      在以下情況下可以考慮使用組合模式:

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

      (2) 在一個使用面嚮物件語言開發的系統中需要處理一個樹形結構。

      (3) 在一個系統中能夠分離出葉子物件和容器物件,而且它們的型別不固定,需要增加一些新的型別。

練習

Sunny軟體公司欲開發一個介面控制元件庫,介面控制元件分為兩大類,一類是單元控制元件,例如按鈕、文字框等,一類是容器控制元件,例如窗體、中間面板等,試用組合模式設計該介面控制元件庫。