模式動機:
對於樹形結構,當容器物件(如資料夾)的某乙個方法被呼叫時,將遍歷整個樹形結構,尋找也包含這個方法的成員物件(可以是容器物件,也可以是葉子物件,如子資料夾和檔案)並呼叫執行。(遞迴呼叫)
由於容器物件和葉子物件在功能上的區別,在使用這些物件的客戶端**中必須有區別地對待容器物件和葉子物件,而實際上大多數情況下我們希望一致地處理它們,因為對於這些物件的區別對待將會使得程式非常複雜。
組合模式就是為解決此類問題而誕生,它通過一種巧妙的設計方案使得客戶端可以一致性地處理整個樹形結構或者樹形結構的一部分,也可以一致性地處理樹形結構中的葉子節點(不包含子節點的節點)和容器節點(包含子節點的節點)。
模式結構:
模式分析:
模式優點:
模式缺點:
模式適用環境:
在以下情況下可以使用組合模式:
模式擴充套件:
透明組合模式
組合模式的標準形式,即在抽象構件component中宣告了所有用於管理成員物件的方法,包括add()、remove()以及getchild()等方法,這樣做的好處是確保所有的構件類都有相同的介面。在客戶端看來,葉子物件與容器物件所提供的方法是一致的,客戶端可以相同地對待所有的物件。
透明組合模式的缺點是不夠安全,因為葉子物件和容器物件在本質上是有區別的。葉子物件不可能有下乙個層次的物件,即不可能包含成員物件,因此為其提供add()、remove()以及getchild()等方法是沒有意義的,這在編譯階段不會出錯,但在執行階段如果呼叫這些方法可能會出錯(如果沒有提供相應的錯誤處理**)。
安全組合模式,在抽象構件component中沒有宣告任何用於管理成員物件的方法,而是在composite類中宣告並實現這些方法。這種做法是安全的,因為根本不向葉子物件提供這些管理成員物件的方法,對於葉子物件,客戶端不可能呼叫到這些方法。
安全組合模式
安全組合模式的缺點是不夠透明,因為葉子構件和容器構件具有不同的方法,且容器構件中那些用於管理成員物件的方法沒有在抽象構件類中定義,因此客戶端不能完全針對抽象程式設計,必須有區別地對待葉子構件和容器構件。在實際應用中安全組合模式的使用頻率也非常高。
設計模式 結構型模式
介面卡模式 adapter pattern 橋接模式 bridge pattern 過濾器模式 filter criteria pattern 組合模式 composite pattern 裝飾器模式 decorator pattern 外觀模式 facade pattern 享元模式 flywei...
設計模式 結構型模式
proxy 模式 中介 介面卡 adapter 模式 轉換器 1.定義 將乙個類的介面轉換成客戶希望的另外乙個介面,使得原本由於介面不相容而不能一起工作的那些類能一起工作。2.優點 復用了現存的類 將目標類和適配者類解耦,解決了目標類和適配者類介面不一致的問題。3.缺點 更換介面卡的實現過程比較複雜...
設計模式 結構型模式
外觀模式 為子系統中的一組介面提供乙個一致的介面,外觀模式定義了乙個高層介面,這個介面使得這一系統更加容易使用。介面卡模式 將乙個類的介面轉換成客戶希望的另外乙個介面。它使得原本由於介面不相容而不能一起工作的那些類一起工作。橋接模式 將抽象部分與它的實現部分分離,使它們可以獨立地變化。組合模式 將物...