**定义:**组合模式(CompositePattern),将对象组合成树形结构以表示“部分—整体”的层次结构。“Composite”使得用户对单个对象和对组合对象的使用具有一致性。
类型:结构型模式。
类图:![](https://box.kancloud.cn/2016-08-19_57b6b465c6e33.jpg)
![](image/d41d8cd98f00b204e9800998ecf8427e.jpg)
参与者:
1. Computer,客户端,选择是否添加USB设备。
1. USBDevice,所有USB设备的抽象类,提供USB设备的基本通信接口。
1. USBMouse,单个对象,没有子部件。
1. USBHub,也即Composite组合对象,可能存在多个子部件。
适用性:
无论是单个对象还是组合对象,用户都希望使用统一接口来控制,这种情况下适合组合模式。
概述:
组合模式给人的感觉很像树干树枝的结构,再一想,其实和USB拓扑结构图也一样(见下图)。主机,可以看作是Client,Hub1可以看作是组合对象,包括两个USB设备以及一个新的组合设备Hub2.![](https://box.kancloud.cn/2016-08-19_57b6b465f1d02.jpg)
![](image/d41d8cd98f00b204e9800998ecf8427e.jpg)
![](image/d41d8cd98f00b204e9800998ecf8427e.jpg)
无论是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——行为型模式之访问者模式
- 设计模式总结