設計模式 (8)組合模式

2022-03-13 04:10:44 字數 2796 閱讀 8096

組合模式

組合模式,是為了解決整體和部分的一致對待的問題而產生的,要求這個整體與部分有一致的操作或行為。部分和整體都繼承與乙個公共的抽象類,這樣,外部使用它們時是一致的,不用管是整體還是部分,使用乙個方法即可遍歷整體中的所有的部分。就像乙個樹形結構一樣。

適用性:

常用於組織結構,產品結構之類的整體和部分的結構。例如圖形由很多直線構成,直線由點構成,這就是整體和部分的關係。如果採用組合模式,只需要使用乙個draw方法即可按遍歷的方式畫出所有的點,最終呈現出來的就是圖形。

優點:

隱藏了整體和部分,讓外部依賴於抽象,簡化了**。

缺點:

1.要求必須有一致的行為。

2.處於同乙個composite的leaf與leaf之間難以傳遞資料。

**實現1

比如乙個集團公司,它有乙個母公司,下設很多家子公司。不管是母公司還是子公司,都有各自直屬的財務部、人力資源部、銷售部等。對於母公司來說,不論是子公司,還是直屬的財務部、人力資源部,都是它的部門。整個公司的部門拓撲圖就是乙個樹形結構。

#include #include 

#include

using

namespace

std;

class

company

virtual ~company(){}

virtual

void add(company *pcom){}

virtual

void show(int

depth) {}

protected

:

string

m_name;

};

//具體公司

class concretecompany : public

company

virtual ~concretecompany() {}

void add(company *pcom) //

位於樹的中間,可以增加子樹

void show(int

depth)

private

: list

m_listcompany;

};

//具體的部門,財務部

class financedepartment : public

company

virtual ~financedepartment() {}

virtual

void show(int depth) //

只需顯示,無限新增函式,因為已是葉結點

};

//具體的部門,人力資源部

class hrdepartment :public

company

virtual ~hrdepartment() {}

virtual

void show(int depth) //

只需顯示,無限新增函式,因為已是葉結點

}; intmain()

結果:

總公司

--財務部

--人力資源部

--分公司a

----財務部

----人力資源部

--分公司b

----財務部

----人力資源部

請按任意鍵繼續. . .

上面的實現方式有缺點,就是記憶體的釋放不好,需要客戶自己動手,非常不方便。有待改進,比較好的做法是讓concretecompany類來釋放。因為所有的指標都是存在concretecompany類的鍊錶中。c++的麻煩,沒有垃圾**機制。

**實現2

下面示例有兩種情況,add函式對於leaf來說是沒有必要的,所以可以在leaf的add實現中什麼都不寫。還一種辦法就是將add方法挪到composite中,讓外部使用composite和component。但這樣的缺點就是暴露了composite,客戶端必須知道composite才能完成操作,好處leaf不用產生多餘的方法了。

#include #include 

using

namespace

std;

class

component

;

virtual ~component(){};

virtual

void operation() = 0;};

class leaf: public

component

; ~leaf(){};

void operation()

};class composite: public

component

; ~composite(){};

void add(component*c)

void

operation()

}private

: vector

m_leafs;

};int

main()

結果:

operation composite

operation composite

operation leaf

operation leaf

請按任意鍵繼續. . .

參考 :

設計模式8 組合模式

組合模式首先想到的就是樹形結構,比如我們常用的檔案結構,請看windows的檔案結構 無論是檔案或者是資料夾,常用操作都是一致的,比如 複製 貼上 剪下 刪除 所佔空間大小。我們並沒有刻意的去分他是資料夾還是檔案。我們可以把資料夾看成是組合物件,把每乙個檔案看成是單個物件。組合模式模糊了這兩個概念,...

8 組合模式

組合模式 1 組合模式 組合模式屬於物件中的結構模式,有時又叫做部分 整體模式。合成模式是將部分和整體的關係用樹結構表示出來。2 結構 以上類圖結構涉及三種角色 抽象構件角色 這是乙個抽象角色,它給參加組合的物件規定乙個介面,這個角色給出共有的介面和預設行為。樹葉構件角色 代表參加組合的樹葉物件。樹...

《設計模式12 組合模式

組合模式其實是乙個很形象的模式。它也被稱為部分整體模式。組合模式的結構就如同樹狀圖一樣。而樹就是枝幹 葉子的組合,組合模式可以形象的這麼理解。其實資料夾是乙個很好的組合模式的體現。乙個資料夾 樹根root 下可能有多個資料夾 枝幹trunk 可能是單個的檔案 樹葉leaf 而枝幹是可以繼續向下延伸的...