天天看點

設計模式之組合模式

    組合模式(Composite),将對象組合成樹形結構來表現“整體&部分”這一層次結構。這種模式能讓客戶以一緻的方式處理個别對象以及對象組合。

    組合内的所有對象都必須實作相同的接口,當組合結構複雜,周遊的成本太高時,就有必要實作組合節點的緩存。組合的優點是可以讓用戶端不再區分操作的是組合對象還是葉子對象,而是以一種統一的方式來操作。

    組合模式的組成部分有以下三個:

(1)抽象構件角色(Component):是組合中的對象聲明接口,在适當的情況下,實作所有類共有接口的預設行為。這個接口可以用來管理所有的子對象。

(2)樹枝構件角色(Composite):定義有子部件的那些部件的行為。在Component接口中實作與子部件有關的操作,構件和構件之間是可以嵌套的。

(3)樹葉構件角色(Leaf):在組合樹中表示葉節點對象,葉節點沒有子節點。并在組合中定義圖元對象的行為。

(4)客戶角色(Client):通過component接口操縱組合部件的對象。

    通常公司的組織形式就是一種組合模式,一個公司的抽象就是個Component,具體的公司來繼承這個抽象類就是Composite,公司下面可以是有子公司,而每個公司又可以有很多部門,每個部門都是葉子Leaf。

    同樣,電腦中的檔案和目錄也是一種組合模式,每個具體的目錄Directory都是Composite,目錄下面可以有很多子錄,也可以放很多檔案,檔案就是樹葉Leaf。

    更直覺的例子,菜單,不同的菜單可以嵌套,最底層就是各個菜單選項。

    下面以公司的組織形式為例。

    阿裡巴巴集團下面很多子公司,阿裡媽媽、淘寶、天貓、阿裡雲等等,每個公司都有自己的部門和主要提供的服務,比如阿裡巴巴主要提供B2B,淘寶主要是C2C,天貓主要是C2C,阿裡雲就是雲計算服務了。每個公司都是獨立的子公司,是以也就有着自己的研發部門、人力資源部門、市場部門等。

    首先建立一個公司的抽象類,就是上面組成部分的“抽象構件”角色:

    下面就是具體的公司類了,就是上面組成部分的“樹枝構件”角色:

    此處的代碼第41行:

之所加2,是因為在這個例子中,我們的組織結構是公司+部門這兩層,要把公司到部門的所有資訊都列印出來,是以到了子公司這一層,層數就得+2了。

    接着就是部門了,即概述中組成部分的“樹葉”角色:

    來個測試類,組織一下阿裡的公司架構:

    測試類中有三個公司,阿裡巴巴、淘寶、阿裡雲,其中,淘寶和阿裡雲是阿裡巴巴的子公司,同時,每個公司又有自己的研發部門和人資部門。

    運作結果:

上個網上經典的組合模式的類圖吧:

設計模式之組合模式