设计模式之类对象结构型 — COMPOSITE(组合)模式

目的

将对象组合成树形结构,以表示“部分-整体”的层次结构

结构

这里写图片描述

示例代码

//test.h  

#ifndef _TEST_H_
#define _TEST_H_

#include <list>
#include <iostream>
using namespace std;

class Component
{
public:
    const char * name(){ return m_name; }

    virtual void draw();

    virtual void add(Component * com){};
    virtual void remove(Component *com){};

    virtual ~Component();
protected:
    Component(const char * name);
private:
    const char * m_name;
};

class Leaf :public Component
{
public:
    Leaf(const char *name);
    ~Leaf();

    virtual void draw();

private:

};


class Composite:public Component
{
public:
    ~Composite();

    virtual void draw(){};

    virtual void add(Component * com);
    virtual void remove(Component *com);
    virtual list<Component *>::iterator createIterator();

protected:
    Composite(const char *name);
private:
    list<Component *> m_component;
};

class LeafComposite:public Composite
{
public:
    LeafComposite(const char * name);
    ~LeafComposite();

    virtual void draw();
private:

};

class LeafCompositeA :public Composite
{
public:
    LeafCompositeA(const char * name);
    ~LeafCompositeA();

    virtual void draw();

private:

};

#endif // !_TEST_H_


----------
//test.cpp

#include "test.h"

Component::Component(const char * name)
:m_name(name)
{

}

void Component::draw()
{
    cout << "component 类" << endl;
}

Component::~Component()
{

}

Leaf::Leaf(const char *name)
:Component(name)
{

}

Leaf::~Leaf()
{

}

void Leaf::draw()
{
    cout << "叶子,继承Component" << endl;
}


Composite::Composite(const char *name)
:Component(name)
{

}

Composite::~Composite()
{
}

void Composite::add(Component * com)
{
    m_component.push_back(com);
    cout <<this->name()<<"添加了一个部件:" << com->name() << endl;
    return;
}

void Composite::remove(Component *com)
{
    for (list<Component*>::iterator iter = m_component.begin(); iter != m_component.end();iter++)
    {
        Component * &c = *iter;
        if (c==com)
        {
            delete c;
            m_component.erase(iter);
            break;
        }
    }
    return;
}

list<Component *>::iterator Composite::createIterator()
{
    return m_component.begin();
}

LeafComposite::LeafComposite(const char * name)
:Composite(name)
{

}

LeafComposite::~LeafComposite()
{

}

void LeafComposite::draw()
{
    cout << "Composite 的叶子类 " << endl;
}

LeafCompositeA::LeafCompositeA(const char * name)
:Composite(name)
{

}

LeafCompositeA::~LeafCompositeA()
{

}

void LeafCompositeA::draw()
{
    cout << "Composite 的叶子类A " << endl;
}


----------
// main.cpp

#include "test.h"

int main()
{
    LeafComposite * leafCom = new LeafComposite("叶子composite");
    LeafCompositeA *leafComA = new LeafCompositeA("叶子compositeA");

    leafCom->draw();
    leafComA->draw();

    leafCom->add(leafComA);
    leafComA->add(new Leaf("叶子Component"));


    getchar();
    return 0;
}

效果

  • 定义了包含基本对象和组合对象的类层次结构 基本对象可以被组合成更复杂的组合对象,而组合对象又可以被组合
  • 简化了客户代码
  • 使得更容易增加新类型的组合

我的个人网站 http://www.breeziness.cn/
我的CSDN http://blog.csdn.net/qq_33775402

转载请注明出处 小风code www.breeziness.cn

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值