組合模式的例子
組合模式的優缺點
注意:本文內容是對 該部落格 的學習。
組合(composite)模式,有時又叫做部分-整體模式
,它是一種將物件組合成樹狀的層次結構的模式
,用來表示「部分-整體」的關係,使使用者對單個物件和組合物件有一致的訪問性。
抽象構件(componet)角色:它的主要作用是為樹葉構件和樹枝構件宣告公共介面
,並實現他們的預設行為
(就是預設的行為,通常指共同擁有的方法等)。
在透明式的組合模式
中抽象構件還宣告訪問和管理子類的介面;在安全式的組合模式
中不宣告訪問和管理子類的介面,管理工作由樹枝構建完成。
樹葉構件(leaf)角色:是組合中的葉節點物件,它沒有子節點
,用於實現抽象構件角色中宣告的公共介面。
樹枝構件(composite)角色:是組合中的分支節點物件,它有子節點
。它實現了抽象構建角色中宣告的介面。它的主要作用是儲存和管理子部件
,通常包含add(),remove(),getchild()等方法。
我對組合模式的理解是:組合模式利用了樹的特性。因為樹可以遞迴到每乙個子節點
,因而當我們對樹的根進行操作的時候,就可以遞迴的對每乙個節點進行操作,這樣,我們可以把樹的根看做這顆樹的代表,即整體,把其他的實體類(leaf和composite)作為樹的節點,當我們操作這棵樹的根的時候,就相當於操作每乙個節點了(遞迴的訪問每乙個節點)。
比如我們要樹和客戶a通話,只需要呼叫樹的根與與a通話的方法,這個方法遞迴的遍歷每乙個節點,最終的效果是所有的節點都與a通話了。
透明式的組合模式
在該方式中,由於抽象構件中宣告了所有子類中的全部方法
,所以客戶端無需區別樹葉物件和樹枝物件,對於客戶端來說是透明的
,下面是其結構圖:
安全式的組合模式
在該方法中,將管理子構件的方法移到樹枝構件中
,抽象構件和樹葉構件沒有對子物件的管理方法,客戶端在呼叫時要知道樹葉物件和樹枝物件的存在,所以失去了透明性
,下面是其結構圖:
我對這兩個模式的理解:二者的區別是透明模式裡對子物件操作的方法在抽象類
裡就有,而安全式裡對子物件操作的方法只有樹枝構件
有。顧名思義,因為在透明式的組合模式中,使用者直接操作根節點就完事了,所以這個模式對於客戶是透明的,但這樣不安全,因為抽象類中的操作子節點的方法在樹葉節點中根本沒有實現,如果客戶對樹葉節點呼叫操作子節點方法,就會丟擲異常。
換言之,把操作子節點的方法放在樹枝構件裡,不放在抽象構件,就可以解決這個安全問題,因而它叫做安全式的組合模式。而安全式的缺點就是,使用者在呼叫的時候,得分清楚自己呼叫的是樹葉物件還是樹枝物件,這就不夠透明了。
該部落格 中用了乙個非常好理解的例子來幫助我們理解組合模式,那就是資料夾的管理。
我們來實現乙個簡單的目錄樹,有資料夾和檔案兩種型別,首先需要乙個抽象構件類,宣告了資料夾類和檔案類需要的方法。
//資料夾-檔案 就是組合模式的一種典型用法
public
abstract
class
component
;public
void
add(component component)
;public
void
remove
(component component)
;public string getcontent()
;public
void
print()
;}
實現乙個資料夾類 folder,繼承 component,定義乙個 list 型別的componentlist屬性,用來儲存該資料夾下的檔案和子資料夾,並實現 getname、add、remove、print等方法
//資料夾就是樹枝節點(composite)
public
class
folder
extends
component
@override
public string getname()
@override
public
void
add(component component)
@override
public
void
remove
(component component)
@override
public
void
print()
string prefix ="";
for(
int i =
0; i <
this
.level;
++i)
for(component component :
this
.componentlist)
system.out.
print
(prefix)
; component.
print()
;}this
.level = null;
// todo auto-generated method stub
}}
檔案類 file,繼承component父類,實現 getname、print、getcontent等方法
public
class
file
extends
component
public string getname()
public string getcontent()
public
void
print()
}
優點:缺點: 設計模式學習 組合模式
組合模式 將物件組合成樹形結構以表示 部分 整體 的層次結構,組合模式使用使用者對單個物件和組合物件的使用具有一致性 但需求中是體現部分與整體層次的結構時,以及希望使用者可以忽略組合物件與單個物件的不同,統一地使用組合結構中的所有物件時,就應該考慮用組合模式了 基本物件可以被組合成更負責的組合物件,...
設計模式學習 組合模式
組合模式,又叫部分整體模式,它建立了物件組的樹形結構,將物件組合成樹狀結構以表示 整體 部分 的層次關係。組合模式依據樹形結構來組合物件,用來表示部分以及整體層次。這種型別的設計模式屬於結構型模式。組合模式使得使用者對單個物件和組合物件的訪問具有一致性,即 組合能夠讓客戶以一致的方式處理個別物件以及...
設計模式 工廠模式的初步學習
工廠方法模式 抽象工廠模式 工廠模式是最常用的一種建立型設計模式。包括抽象工廠模式 工廠方法模式和簡單工廠模式。其中簡單工廠模式是最簡單的一種。簡單工廠模式 factory pattern 定義乙個工廠類,它可以根據引數的不同返回不同類的例項,被建立的例項通常都具有共同的父類。因為在簡單工廠模式中用...