設計模式 組合模式的初步學習

2021-09-18 06:45:31 字數 3335 閱讀 2651

組合模式的例子

組合模式的優缺點

注意:本文內容是對 該部落格 的學習。

組合(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 定義乙個工廠類,它可以根據引數的不同返回不同類的例項,被建立的例項通常都具有共同的父類。因為在簡單工廠模式中用...