适用场景:整体和部分可以被一致对待(如WORD中复制一个文字、一段文字、一篇文章都是一样的操作)
#include <iostream>
#include <list>
#include <assert.h>
class Component
{
public:
Component(const char* szName);
virtual ~Component();
virtual void Add(Component* p);
virtual void Remove(Component* p);
virtual Component* Child(int index);
virtual Component* Parent();
//测试
virtual void Print()
{
if(Parent())
{
std::cout<<"节点名:"<<m_szName<<",父节点:"<<Parent()->m_szName<<std::endl;
}
}
public:
void SetParent(Component* p);
protected:
Component* m_pParent;
const char* m_szName;
};
class Composite : public Component
{
public:
Composite(const char* szName);
virtual ~Composite();
virtual void Add(Component* p);
virtual void Remove(Component* p);
virtual Component* Child(int index);
virtual Component* Parent();
//测试
virtual void Print()
{
std::list<Component*>::iterator begin = m_Components.begin();
std::list<Component*>::iterator end = m_Components.end();
for(; begin != end; begin++)
{
(*begin)->Print();
}
}
protected:
std::list<Component*> m_Components;
};
Component::Component(const char* szName)
{
m_pParent = NULL;
m_szName = szName;
}
Component::~Component()
{
}
void Component::SetParent(Component* p)
{
m_pParent = p;
}
void Component::Add(Component* p)
{
//什么也不做
}
void Component::Remove(Component* p)
{
//什么也不做
}
Component* Component::Child(int index)
{
//什么也不做
return NULL;
}
Component* Component::Parent()
{
return m_pParent;
}
Composite::Composite(const char* szName):Component(szName)
{
}
Composite::~Composite()
{
}
void Composite::Add(Component* p)
{
assert(p);
if (p != NULL)
{
p->SetParent(this);
m_Components.push_back(p);
}
}
void Composite::Remove(Component* p)
{
assert(p);
if (p != NULL)
{
p->SetParent(NULL);
m_Components.remove(p);
}
}
Component* Composite::Child(int index)
{
std::list<Component*>::iterator begin = m_Components.begin();
std::list<Component*>::iterator end = m_Components.end();
int temp = 0;
for(; begin != end; begin++)
{
if(temp++ == index)
{
return *begin;
}
}
return NULL;
}
Component* Composite::Parent()
{
return m_pParent;
}
int _tmain(int argc, _TCHAR* argv[])
{
Component* lpComponent = new Composite("父节点");
lpComponent->Add(new Component("根节点1"));
lpComponent->Add(new Component("根节点2"));
lpComponent->Add(new Component("根节点3"));
lpComponent->Print();
system("pause");
return 0;
}