9——结构型模式之组合模式
最后更新于:2022-04-01 20:10:46
**定义:**组合模式(CompositePattern),将对象组合成树形结构以表示“部分—整体”的层次结构。“Composite”使得用户对单个对象和对组合对象的使用具有一致性。
类型:结构型模式。
类图:![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/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://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-08-19_57b6b465f1d02.jpg)
![](image/d41d8cd98f00b204e9800998ecf8427e.jpg)
![](image/d41d8cd98f00b204e9800998ecf8427e.jpg)
无论是USB设备还是USBHub,主机都可以通过相同的命令来访问它们。这也正是组合模式要完成的工作。即Client能够通过相同的接口来访问单个设备和组合设备。
示例代码:
~~~
#include
#include
-
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<<"传递鼠标移动点击信息"<