設計模式之組合模式

2021-08-15 03:19:52 字數 2106 閱讀 8682

1. 定義

組合模式(composite):指的是能夠使容器和內容具有一致性,創造出遞迴結構的模式。

該模式表示部分與整體的層次結構,使得我們對單個物件和組合物件的使用具有一致性,也就是在使用的的時候他們對外暴露出相同的介面。

遞迴結構在計算機系統中很常見,比如熟知的檔案系統,目錄和檔案都是檔案,目錄也可以包含檔案。

2. 類圖

該模式有3個明顯特徵,對應類圖:

以檔案系統作為例子吧,這個最容易理解。

首先定義乙個entry類,它代表了檔案系統的乙個條目(既可能是檔案也可能是目錄):

/**

* 使leaf和composite具有一致性的component角色

*/public

abstract

class

entry

public

void

printlist()

protected

abstract

void

printlist(string prefix);

public string tostring()

}

entry暴露了統一的介面,無法實現的方法抽象出來交給子類去實現(模板方法模式)。

另外addentry方法實現了但是直接丟擲了異常,因為檔案本身是不能再去新增條目的。這只是一種實現方式。其他實現方式可以寫成抽象方法, 讓子類都去實現,強制讓leaf角色去實現乙個空方法。個人認為當前這種實現方式比較合理。只要真正的呼叫方知道這個規則就行,否則拋異常。

接下來定義composite角色的directory類:

/**

* composite角色

*/public

class

directory

extends

entry

@override

public string getname()

@override

public entry addentry(entry entry)

@override

public

intgetsize()

return size;

}@override

protected

void

printlist(string prefix) }}

定義file類:

/**

* leaf 角色

*/public

class

file

extends

entry

@override

public string getname()

@override

public

intgetsize()

@override

protected

void

printlist(string prefix)

}

對比可以發現,directory 重寫了addentry方法而file 類沒有,所以客戶端在真正呼叫的時候要知道這裡的具體細節,否則就是不安全的呼叫。

定義client角色:

/**

* client角色

*/public

class

main

}

執行結果:

/root(50)

/root/usrdir(0)

/root/usrdir/bin(0)

/root/usrdir/games(0)

/root/usrdir/local(0)

/root/homedir(0)

/root/bin(50)

/root/bin/vim(20)

/root/bin/ls(30)

設計模式之組合模式

組合模式 以 整體 部分 的層次結構,將物件以樹型結構組合起來。如下圖所示 組合模式首先得定義乙個用來管理和訪問部件們的抽象類。public abstract class equipment 再建立乙個組合體的部件 class element equipment 現在我們再來定義乙個組合體,也就是組...

設計模式之 組合模式

有時候我們需要維護一些物件,這些物件具有一定的層次結構,它們之間雖然差異很大,但在使用的時候我們希望能構一致的對待,比如windows控制項,繪圖中的圖形等,這個時候我們就可以採用組合模式來進行管理。組合模式就是將要管理的物件按樹型結構來進行組織,表示成一種 整體 部分 的層次結構,使得使用者對單個...

設計模式之組合模式

組合模式 將物件組合成樹形結構以表示 部分 整體 的層次結構。使得使用者對單個物件和組合物件的使用具有一致性。適用性 想表示物件的部分 整體層次結構,希望使用者忽略組合物件與單個物件的不同,使用者將統一地使用組合結構中的所有物件。典型表示結構圖 宣告組合中的物件宣告介面 在適當的情況下,實現所有類共...