設計模式之類對象結構型 — 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

發佈了78 篇原創文章 · 獲贊 75 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章