**定義:**組合模式(CompositePattern),將對象組合成樹形結構以表示“部分—整體”的層次結構。“Composite”使得用戶對單個對象和對組合對象的使用具有一致性。
類型:結構型模式。
類圖:

參與者:
1. Computer,客戶端,選擇是否添加USB設備。
1. USBDevice,所有USB設備的抽象類,提供USB設備的基本通信接口。
1. USBMouse,單個對象,沒有子部件。
1. USBHub,也即Composite組合對象,可能存在多個子部件。
適用性:
????????無論是單個對象還是組合對象,用戶都希望使用統一接口來控制,這種情況下適合組合模式。
概述:
???????組合模式給人的感覺很像樹干樹枝的結構,再一想,其實和USB拓撲結構圖也一樣(見下圖)。主機,可以看作是Client,Hub1可以看作是組合對象,包括兩個USB設備以及一個新的組合設備Hub2.


??????無論是USB設備還是USBHub,主機都可以通過相同的命令來訪問它們。這也正是組合模式要完成的工作。即Client能夠通過相同的接口來訪問單個設備和組合設備。
示例代碼:
~~~
#include <iostream>
#include <list>
using namespace std;
// 抽象接口
class CUSBDevice
{
public:
virtual ~CUSBDevice(){}
virtual void Add(CUSBDevice* _pDev){}
virtual void Remove(CUSBDevice* _pDev){}
virtual void Transmit(){}
virtual int GetChild(){return 0;}
};
// 單一個對象,不能添加新部件
class CUSBMouse : public CUSBDevice
{
public:
virtual void Transmit()
{
cout<<"傳遞鼠標移動點擊信息"<<endl;
}
};
// 組合對象,可以添加多個新部件
class CUSBHub : public CUSBDevice
{
public:
virtual void Add(CUSBDevice* _pDev)
{
m_listDev.push_back(_pDev);
}
virtual void Remove(CUSBDevice* _pDev)
{
m_listDev.remove(_pDev);
}
virtual void Transmit()
{
cout<<"傳輸USBHub信息"<<endl;
}
virtual int GetChild()
{
return m_listDev.size();
}
private:
list<CUSBDevice*> m_listDev;
};
~~~
// 電腦主機先接了一個HubA,HubA再接了一個USB鼠標以及又一個USBHubB
// USBHubB又接一個USB鼠標
~~~
int _tmain(int argc, _TCHAR* argv[])
{
// 先建立一個USBHub
CUSBHub hubA;
CUSBDevice* pUSBMA = new CUSBMouse;
hubA.Add(pUSBMA);
// USBHubB
CUSBDevice* pUSBHubB = new CUSBHub;
CUSBDevice* pUSBMB = new CUSBMouse;
pUSBHubB->Add(pUSBMB);
hubA.Add(pUSBHubB);
// 移除設備
if (pUSBMA->GetChild() > 0)
{
cout<<"移除設備"<<endl;
}
delete pUSBMA;
delete pUSBMB;
delete pUSBHubB;
return 0;
}
~~~
**注意:**抽象基類的析構函數一定要是虛函數,否則內存釋放的時候會有問題。
**優缺點:**
1. 優點,能夠非常靈活地添加單個部件以及組合部件,不用區別對待單個對象以及組合對象。
**參考資料:**
1. 《設計模式——可復用面向對象軟件基礎》
1. 《Java與模式》
1. 《大話設計模式》
- 前言
- 設計模式六大原則
- 1——創建型模式之簡單工廠模式
- 2——創建型模式之工廠方法模式
- 3——創建型模式之抽象工廠模式
- 4——創建型模式之單例模式
- 5——創建型模式之建造者模式
- 6——創建型模式之原型模式
- 7——結構型模式之適配器模式
- 8——結構型模式之橋接模式
- 9——結構型模式之組合模式
- 10——結構型模式之裝飾者模式
- 11——結構型模式之外觀模式
- 12——結構型模式之享元模式
- 13——結構型模式之代理模式
- 14——行為型模式之職責鏈模式
- 15——行為型模式之命令模式
- 16——行為型模式之解釋器模式
- 17——行為型模式之迭代器模式
- 18——行為型模式之中介者模式
- 19——行為型模式之備忘錄模式
- 20——行為型模式之觀察者模式
- 21——行為型模式之狀態模式
- 22——行為型模式之策略模式
- 23——行為型模式之模板方法模型
- 24——行為型模式之訪問者模式
- 設計模式總結