设计模式9——结构型模式之组合模式

定义:组合模式(CompositePattern),将对象组合成树形结构以表示“部分—整体”的层次结构。“Composite”使得用户对单个对象和对组合对象的使用具有一致性。

类型:结构型模式。

类图:


参与者:

  1. Computer,客户端,选择是否添加USB设备。
  1. USBDevice,所有USB设备的抽象类,提供USB设备的基本通信接口。
  1. USBMouse,单个对象,没有子部件。
  1. USBHub,也即Composite组合对象,可能存在多个子部件。

适用性:

         无论是单个对象还是组合对象,用户都希望使用统一接口来控制,这种情况下适合组合模式。

概述:

        组合模式给人的感觉很像树干树枝的结构,再一想,其实和USB拓扑结构图也一样(见下图)。主机,可以看作是ClientHub1可以看作是组合对象,包括两个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. 《设计模式——可复用面向对象软件基础》
  2. Java与模式》
  1. 《大话设计模式》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值