樹形結構的處理——組合模式(五)
11.5 公司組織結構
在學習和使用組合模式時,Sunny軟體公司開發人員發現樹形結構其實隨處可見,例如Sunny公司的組織結構就是“一棵標準的樹”,如圖11-8所示:
圖11-8 Sunny公司組織結構圖
在Sunny軟體公司的內部辦公系統Sunny OA系統中,有一個與公司組織結構對應的樹形選單,行政人員可以給各級單位下發通知,這些單位可以是總公司的一個部門,也可以是一個分公司,還可以是分公司的一個部門。使用者只需要選擇一個根節點即可實現通知的下發操作,而無須關心具體的實現細節。這不正是組合模式的“特長”嗎?於是Sunny公司開發人員繪製瞭如圖11-9所示結構圖:
圖11-9 Sunny
在圖11-9中,“單位”充當了抽象構件角色,“公司”充當了容器構件角色,“研發部”、“財務部”和“人力資源部”充當了葉子構件角色。
|
11.6 組合模式總結
組合模式使用面向物件的思想來實現樹形結構的構建與處理,描述瞭如何將容器物件和葉子物件進行遞迴組合,實現簡單,靈活性好。由於在軟體開發中存在大量的樹形結構,因此組合模式是一種使用頻率較高的結構型設計模式,Java SE中的AWT和Swing包的設計就基於組合模式,在這些介面包中為使用者提供了大量的容器構件(如Container)和成員構件(如Checkbox、Button
圖11-10 AWT組合模式結構示意圖
在圖11-10中,Component類是抽象構件,Checkbox、Button和TextComponent是葉子構件,而Container是容器構件,在AWT中包含的葉子構件還有很多,因為篇幅限制沒有在圖中一一列出。在一個容器構件中可以包含葉子構件,也可以繼續包含容器構件,這些葉子構件和容器構件一起組成了複雜的GUI介面。
除此以外,在XML解析、組織結構樹處理、檔案系統設計等領域,組合模式都得到了廣泛應用。
1. 主要優點
組合模式的主要優點如下:
(1)
(2) 客戶端可以一致地使用一個組合結構或其中單個物件,不必關心處理的是單個物件還是整個組合結構,簡化了客戶端程式碼。
(3) 在組合模式中增加新的容器構件和葉子構件都很方便,無須對現有類庫進行任何修改,符合“開閉原則”。
(4) 組合模式為樹形結構的面向物件實現提供了一種靈活的解決方案,通過葉子物件和容器物件的遞迴組合,可以形成複雜的樹形結構,但對樹形結構的控制卻非常簡單。
2. 主要缺點
組合模式的主要缺點如下:
在增加新構件時很難對容器中的構件型別進行限制。有時候我們希望一個容器中只能有某些特定型別的物件,例如在某個資料夾中只能包含文字檔案,使用組合模式時,不能依賴型別系統來施加這些約束,因為它們都來自於相同的抽象層,在這種情況下,必須通過在執行時進行型別檢查來實現,這個實現過程較為複雜。
3. 適用場景
在以下情況下可以考慮使用組合模式:
(1) 在具有整體和部分的層次結構中,希望通過一種方式忽略整體與部分的差異,客戶端可以一致地對待它們。
(2) 在一個使用面嚮物件語言開發的系統中需要處理一個樹形結構。
(3) 在一個系統中能夠分離出葉子物件和容器物件,而且它們的型別不固定,需要增加一些新的型別。
|