對於樹形結構,當容器物件(如資料夾)的某乙個方法被呼叫時,將遍歷整個樹形結構,尋找也包含這個方法的成員物件(可以是容器物件,也可以是葉子物件)並呼叫執行,牽一而動百,其中使用了遞迴呼叫的機制來對整個結構進行處理。由於容器物件和葉子物件在功能上的區別,在使用這些物件的**中必須有區別地對待容器物件和葉子物件,而實際上大多數情況下我們希望一致地處理它們,因為對於這些物件的區別對待將會使得程式非常複雜。組合模式為解決此類問題而誕生,它可以讓葉子物件和容器物件的使用具有一致性。
組合模式定義如下:
組合模式(composite pattern):組合多個物件形成樹形結構以表示具有「整體—部分」關係的層次結構。組合模式對單個物件(即葉子物件)和組合物件(即容器物件)的使用具有一致性,組合模式又可以稱為「整體—部分」(part-whole)模式,它是一種物件結構型模式。
在組合模式中引入了抽象構件類component,它是所有容器類和葉子類的公共父類,客戶端針對component進行程式設計。組合模式結構如圖11-3所示:
圖11-3 組合模式結構圖
在組合模式結構圖中包含如下幾個角色:
●component(抽象構件):
它可以是介面或抽象類,為葉子構件和容器構件物件宣告介面,在該角色中可以包含所有子類共有行為的宣告和實現。在抽象構件中定義了訪問及管理它的子構件的方法,如增加子構件、刪除子構件、獲取子構件等。
●leaf(葉子構件):
它在組合結構中表示葉子節點物件,葉子節點沒有子節點,它實現了在抽象構件中定義的行為。對於那些訪問及管理子構件的方法,可以通過異常等方式進行處理。
●composite(容器構件):
它在組合結構中表示容器節點物件,容器節點包含子節點,其子節點可以是葉子節點,也可以是容器節點,它提供乙個集合用於儲存子節點,實現了在抽象構件中定義的行為,包括那些訪問及管理子構件的方法,在其業務方法中可以遞迴呼叫其子節點的業務方法。
組合模式的關鍵是定義了乙個抽象構件類,它既可以代表葉子,又可以代表容器,而客戶端針對該抽象構件類進行程式設計,無須知道它到底表示的是葉子還是容器,可以對其進行統一處理。
同時容器物件與抽象構件類之間還建立乙個聚合關聯關係,在容器物件中既可以包含葉子,也可以包含容器,以此實現遞迴組合,形成乙個樹形結構。
如果不使用組合模式,客戶端**將過多地依賴於容器物件複雜的內部實現結構,容器物件內部實現結構的變化將引起客戶**的頻繁變化,帶來了**維護複雜、可擴充套件性差等弊端。組合模式的引入將在一定程度上解決這些問題。
下面通過簡單的示例**來分析組合模式的各個角色的用途和實現。對於組合模式中的抽象構件角色,其典型**如下所示:
abstract class component
一般將抽象構件類設計為介面或抽象類,將所有子類共有方法的宣告和實現放在抽象構件類中。對於客戶端而言,將針對抽象構件程式設計,而無須關心其具體子類是容器構件還是葉子構件。
如果繼承抽象構件的是葉子構件,則其典型**如下所示:
class leaf extends component
public void remove(component c)
public component getchild(int i)
public void operation()
}
作為抽象構件類的子類,在葉子構件中需要實現在抽象構件類中宣告的所有方法,包括業務方法以及管理和訪問子構件的方法,但是葉子構件不能再包含子構件,因此在葉子構件中實現子構件管理和訪問方法時需要提供異常處理或錯誤提示
。當然,這無疑會給葉子構件的實現帶來麻煩。
如果繼承抽象構件的是容器構件,則其典型**如下所示:
class composite extends component
public void remove(component c)
public component getchild(int i)
public void operation()
}
}
在容器構件中實現了在抽象構件中宣告的所有方法,既包括業務方法,也包括用於訪問和管理成員子構件的方法,如add()、remove()和getchild()等方法。需要注意的是在實現具體業務方法時,由於容器構件充當的是容器角色,包含成員構件,因此它將呼叫其成員構件的業務方法。在組合模式結構中,由於容器構件中仍然可以包含容器構件,因此在對容器構件進行處理時需要使用遞迴演算法
,即在容器構件的operation()方法中遞迴呼叫其成員構件的operation()方法。 思考
在組合模式結構圖中,如果聚合關聯關係不是從composite到component的,而是從composite到leaf的,如圖11-4所示,會產生怎樣的結果?
圖11-4 組合模式思考題結構圖
】 copy
樹形結構葉子節點的作用 結構型組合模式
定義 組合模式也叫合成模式,有時又叫做部分 整體模式,主要是用來描述部分與整體的關係,將物件組合成樹形結構以表示 部分 整體 的層次結構,使得使用者對單個物件和組合物件的使用具有一致性 結構 組合模式包含三個角色 使用場景 優缺點 示例 例如,大型公司就是乙個典型的組合模式應用的例子,大型公司有總部...
樹形結構資料處理
前端使用 構造樹型結構資料 param data 資料來源 param depid 兒子節點id欄位 預設 depid param parentid 父節點id欄位 預設 parentid param children 孩子節點資料儲存字段 預設 children param rootid 根id ...
結構模式 組合模式
組合模式 composite pattern 組合多個物件形成樹形結構以表示具有 整體 部分 關係的層次結構。組合模式對單個物件 即葉子物件 和組合物件 即容 器物件 的使用具有一致性,組合模式又可以稱為 整體 部分 part whole 模式,它是一種物件結構型模式。將物件組合成樹形結構以表示部分...