🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
**定义:**组合模式(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. 《大话设计模式》