设计模式9——结构型模式之组合模式
来源:互联网 发布:网络数据采集 编辑:程序博客网 时间:2024/06/04 19:48
定义:组合模式(CompositePattern),将对象组合成树形结构以表示“部分—整体”的层次结构。“Composite”使得用户对单个对象和对组合对象的使用具有一致性。
类型:结构型模式。
类图:
参与者:
- Computer,客户端,选择是否添加USB设备。
- USBDevice,所有USB设备的抽象类,提供USB设备的基本通信接口。
- USBMouse,单个对象,没有子部件。
- 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;}
注意:抽象基类的析构函数一定要是虚函数,否则内存释放的时候会有问题。
优缺点:
- 优点,能够非常灵活地添加单个部件以及组合部件,不用区别对待单个对象以及组合对象。
参考资料:
- 《设计模式——可复用面向对象软件基础》
- 《Java与模式》
- 《大话设计模式》
0 0
- 组合模式——结构型设计模式之三
- java设计模式——结构型之组合模式
- 设计模式9——结构型模式之组合模式
- 设计模式-结构型之组合模式
- 【设计模式】—-(9)组合模式(结构型)
- 设计模式 - 结构型模式 - 组合模式
- java结构型设计模式——组合模式
- JAVA设计模式(11) —<结构型>组合模式(Composite)
- 结构型模式之三——组合模式
- 结构型模式之——组合模式
- 设计模式之十一:Composite(组合)—对象结构型模式
- java设计模式(结构型)之组合模式
- 设计模式(结构型)之组合模式(Composite Pattern)
- 结构型:设计模式之组合模式(十)
- 【设计模式】结构型模式之组合Composite
- 结构型设计模式之组合模式(Composite Pattern)
- Python的结构型设计模式之组合模式
- 设计模式之结构型-组合模式(12)
- 锋利jquery---第四章
- 导入新闻源码,运行一次后,main.xml 报错!
- 1007. To and Fro
- geohash:用字符串实现附近地点搜索
- Android【USB名称修改系列】第8项-如何修改mtp设备在设备管理器中的”Portable Devices”下的名称
- 设计模式9——结构型模式之组合模式
- ios_oc学习总结
- Android【USB名称修改系列】第9项-如何修改UMS在设备管理器中DiskDrive下的名称
- poiSearchInCity()怎么搜索到一个县城
- Android【USB名称修改系列】第10项-如何修改设备管理器中设备名后的数字
- Rtmp协议简单分析(一)——协议数据
- error LNK2005: _malloc already defined in LIBCMT.lib(malloc.obj)
- ISE自带仿真器
- 微信接口开发