目的
將對象組合成樹形結構,以表示“部分-整體”的層次結構
結構
示例代碼
//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