C 設計模式 組合模式

2021-07-13 16:30:08 字數 2830 閱讀 1906

一、組合模式的定義

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

二、說明

組合模式關注那些包含葉子構件和容器構件的結構以及它們的組織形式,在葉子結構中不包含成員物件,而容器構件中包含成員物件,這些物件通過遞迴組合可構成乙個樹形結構。

由於容器物件和葉子物件在功能上存在區別,因此在使用這些物件的**中必須有區別的對待容器物件和葉子物件。

三、組合模式的結構

1)抽象構件(component)

可以是介面或抽象類,該類為葉子構件和容器構建宣告介面,在該類中可以包含所有子類共有行為的宣告和實現。同時,在抽象構建類中還定義了訪問及管理它的子構件的方法。

2)葉子構件(leaf)

表示葉子結點物件,葉子結點沒有子結點,它實現了在抽象構件中定義的行為。

3)  容器構件(composite)

表示容器結點物件,容器結點包含子結點,其子結點可以是葉子結點也可以是容器結點。容器構件類中提供乙個集合用於儲存子結點,實現了在抽象構件中定義的行為,包括那些訪問及管理子構件的方法。在業務方法中可以遞迴呼叫其子結點的業務方法。

四、應用例項

使用組合模式設計防毒軟體的框架:

該軟體即可對某個資料夾(folder)防毒,也可以對檔案(file)進行防毒,可以根據各類檔案的特點,為不同型別的檔案提供不同的防毒方式,如影象檔案(imagefile)和文字檔案(textfile)

abstractfile.cs抽象檔案類,充當抽象構件類;

folder.cs資料夾類,充當容器構件類;

//抽象檔案類,充當抽象構件類

abstract

class

abstractfile

//影象檔案類,充當葉子結點類

class

imagefile:abstractfile

public

override

voidadd(abstractfile file)

public

override

voidremove(abstractfile file)

public

override

abstractfile getchild(int i)

public

override

voidkillvirus() '

進行防毒

", name); }

} //文字檔案類,充當葉子構件

class

textfile:abstractfile

public

override

voidadd(abstractfile file)

public

override

voidremove(abstractfile file)

public

override

abstractfile getchild(int i)

public

override

voidkillvirus() '

進行防毒

", name); }

} //class

videofile:abstractfile

public

override

voidadd(abstractfile file)

public

override

voidremove(abstractfile file)

public

override

abstractfile getchild(int i)

public

override

voidkillvirus() '

進行防毒

", name); }

} //資料夾類,充當容器構件類

class

folder:abstractfile

public

override

voidadd(abstractfile file)

public

override

voidremove(abstractfile file)

public

override

abstractfile getchild(int i)

public

override

voidkillvirus() '

進行防毒

", name);//

模擬實現防毒

//遞迴呼叫成員構件的

killvirus()

方法foreach(object obj infilelist)

} }

class

program }

五、透明組合模式

在透明組合模式中,抽象構件component中宣告了所有用於管理成員物件的方法,目的是確保所有的構件類都有相同的介面。

缺點:存在不安全性。因為葉子結點物件和容器物件在本質上是有區別的。葉子物件不存在下乙個層次的物件,即不可能包好成員物件,因此為其提供一些方法是沒有意義的,即使在編譯階段不會報錯,但容易在執行過程中出錯。

六、安全組合模式

在安全組合模式中,抽象構件component中沒有宣告任何用於管理成員物件的方法,而在composite類中宣告並實現這些方法。相對於透明組合模式是安全的。

缺點:不夠透明。leaf和composite具有不用的方法,容器構件類中用於管理成員物件的方法沒有在抽象構件類中定義,因此客戶端不能完全針對抽象程式設計,必須有區別對待。

七、組合模式優點

1)具有層次性;

2)便於客戶端操作;

3)符合開閉原則。

C 設計模式 組合模式

一.概述 組合模式,將物件組合成樹形結構以表示 部分 整體 的層次結構,組合模式使得使用者對單個物件和組合物件的使用具有一致性。結構 1.component 是組合中的物件宣告介面,在適當的情況下,實現所有類共有介面的預設行為。宣告乙個介面用於訪問和管理component子部件。2.leaf 在組合...

C 設計模式 組合模式

ifndef composite h define composite h include include include 說明 組合模式的關鍵是定義了乙個抽象構件類,它既可以代表葉子,又可以代表容器,而客戶端針對該抽象構件類進行程式設計,無須知道它到底表示的是葉子還是容器,可以對其進行統一處理。同...

C 設計模式 組合模式

目錄 基本概念 與例項 個人感覺qt的物件樹就是運用了這種設計模式!當然,只是個人感覺,本人並沒有研究qt的原始碼 組合模式 composite 將物件組合成樹形結構以表示 部分 整體 的層次結構。組合模式使得使用者對單個物件和組合物件的使用具有一致性。何時使用 需求中提現部分和整體的層次結構,開發...