組合模式
組合模式,是為了解決整體和部分的一致對待的問題而產生的,要求這個整體與部分有一致的操作或行為。部分和整體都繼承與乙個公共的抽象類,這樣,外部使用它們時是一致的,不用管是整體還是部分,使用乙個方法即可遍歷整體中的所有的部分。就像乙個樹形結構一樣。
適用性:
常用於組織結構,產品結構之類的整體和部分的結構。例如圖形由很多直線構成,直線由點構成,這就是整體和部分的關係。如果採用組合模式,只需要使用乙個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 #includeusing
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 compositeoperation composite
operation leaf
operation leaf
請按任意鍵繼續. . .
參考 :
設計模式8 組合模式
組合模式首先想到的就是樹形結構,比如我們常用的檔案結構,請看windows的檔案結構 無論是檔案或者是資料夾,常用操作都是一致的,比如 複製 貼上 剪下 刪除 所佔空間大小。我們並沒有刻意的去分他是資料夾還是檔案。我們可以把資料夾看成是組合物件,把每乙個檔案看成是單個物件。組合模式模糊了這兩個概念,...
8 組合模式
組合模式 1 組合模式 組合模式屬於物件中的結構模式,有時又叫做部分 整體模式。合成模式是將部分和整體的關係用樹結構表示出來。2 結構 以上類圖結構涉及三種角色 抽象構件角色 這是乙個抽象角色,它給參加組合的物件規定乙個介面,這個角色給出共有的介面和預設行為。樹葉構件角色 代表參加組合的樹葉物件。樹...
《設計模式12 組合模式
組合模式其實是乙個很形象的模式。它也被稱為部分整體模式。組合模式的結構就如同樹狀圖一樣。而樹就是枝幹 葉子的組合,組合模式可以形象的這麼理解。其實資料夾是乙個很好的組合模式的體現。乙個資料夾 樹根root 下可能有多個資料夾 枝幹trunk 可能是單個的檔案 樹葉leaf 而枝幹是可以繼續向下延伸的...