#include "stdafx.h"
#include <iostream>
#include <vector>
using namespace std;
class Component
{
public:
virtual Component* clone() = 0;
virtual void operation() = 0;
virtual void Add(Component* pComponent) {}
virtual void Remove(Component* pComponent) {}
virtual Component* Getchild(int index) const {return 0;}
virtual ~Component() {}
};
class Composite:public Component
{
public:
Composite() {m_vector.clear();}
Composite(const Composite& rhs);
Component* clone();
void Add(Component* pComponent);
void Remove(Component* pComponent);
Component* Getchild(int index) const;
void operation();
vector<Component*> GetData() const;
private:
vector<Component* > m_vector;
};
Component* Composite::clone()
{
return new Composite(*this);
}
Composite::Composite(const Composite& rhs)
{
int nSize = rhs.GetData().size();
m_vector.resize(nSize);
//m_vector = rhs.GetData();
//int a = 5;
vector<Component*> vt = rhs.GetData();
memcpy(&m_vector[0], &vt[0], nSize*sizeof(Component*));
}
vector<Component*> Composite::GetData() const
{
return m_vector;
}
void Composite::Add(Component* pComponent)
{
m_vector.push_back(pComponent);
}
void Composite::Remove(Component* pComponent)
{
vector<Component* >::iterator it = m_vector.begin();
while(it != m_vector.end())
{
if(*it == pComponent)
{
it = m_vector.erase(it);
}
else
{
++it;
}
}
}
Component* Composite::Getchild(int index) const
{
if(index >0 && index <= (int)m_vector.size())
{
return m_vector[index];
}
}
void Composite::operation()
{
cout<<"this is the composite"<<endl;
vector<Component*>::iterator it = m_vector.begin();
while (it != m_vector.end())
{
(*it)->operation();
++it;
}
}
class Leaf:public Component
{
public:
Leaf() {}
Leaf(const Leaf& rhs) {}
Component* clone() {return new Leaf(*this);}
void operation() {cout<<"this is the leaf"<<endl;}
};
int _tmain(int argc, _TCHAR* argv[])
{
Component* pRoot = new Composite();
Leaf* pLeafA = new Leaf();
Leaf* pLeafB = new Leaf();
pRoot->Add(pLeafA);
pRoot->Add(pLeafB);
cout<<"before the delete:"<<endl;
pRoot->operation();
Component* pRootOld = pRoot->clone();
pRoot->Remove(pLeafA);
cout<<endl<<"after remove a leaf:"<<endl;
pRoot->operation();
cout<<endl<<"the state before delete:"<<endl;
pRootOld->operation();
getchar();
return 0;
}