設計模式之組合模式

2021-09-29 19:57:28 字數 2058 閱讀 5779

引入

sunny 軟體公司欲開發乙個防毒(antivirus)軟體,該軟體既可以對某個資料夾(folder)防毒,也可以對某個指定的檔案(file)進

行防毒。

該防毒軟體還可以根據各類檔案的特點,為不同型別的檔案提供不同的防毒方式,例如影象檔案(imagefile)和文字檔案(textfile)的防毒方式就有所差異。現需要提供該防毒軟體的整體框架設計方案。

其檔案目錄格式為樹形結構

初始方案

初始的解決方案如下:

public

class

imagefile

public

void

killvirus()

}public

class

textfile

public

void

killvirus()

}public

class

folder

public

void

killvirus()

foreach

(imagefile image in _imagelist)

foreach

(textfile text in _textlist)

}}

這樣的方案存在如下問題:

這一切都是由於,沒有提供抽象層。

我們用組合模式來改進上述方案。

改進方案

通過提供乙個抽象層,從而使得系統可以統一 處理各種類,解決了上述問題。

組合模式

組合模式(composite pattern):

組合多個物件形成 樹形結構 以表示具有「整體-部分」關係的層次結構。

在組合模式中 對單個物件(葉子)和組合物件(容器) 的使用具有一致性。

通過組合模式,可以較好的處理樹形結構,它描述了如何將容器和葉子進行遞迴組合,使得客戶端在使用時無需對容器、葉子進行區分,而是可以統一地進行處理。

使用要點:

模式結構圖

**如下:

/// 

/// 抽象類

///

public

abstract

class

component

///

/// 葉子

///

public

class

leaf

:component

public

override

void

remove

(component c)

public

override

component

getchild

(int i)

public

override

void

operation()

}///

/// 容器

///

public

class

composite

:component

public

override

void

remove

(component c)

public

override

component

getchild

(int i)

public

override

void

operation()

}}

但是,這樣的設計也存在著一些問題,每一次新增新型別,都需要實現抽象類中的方法(如add()、remove()等),比較麻煩,而且有的時候,我們並不需要其中的一些方法,比如:葉子結點沒有子節點,不需要getchild()方法

透明組合模式和安全組合模式

為了解決上述問題,在一定程度上簡化**,有了兩種解決方案。

總結組合模式通過提供乙個抽象類,使用關聯關係,組合多個物件,從而可以較好地處理樹形結構。

設計模式之組合模式

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

設計模式之 組合模式

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

設計模式之組合模式

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