#include <iostream>
#include <list>
using namespace std;
class Component{
public:
virtual ~Component(){}
virtual void process() = 0;
};
class Leaf : public Component{
public:
Leaf(string leafName):m_leafName(leafName){}
void process(){
std::cout<<m_leafName.data()<<endl;
}
private:
string m_leafName;
};
class Composite : public Component{
public:
Composite(string compositeName) : m_compositeName(compositeName){}
void process(){
cout<<m_compositeName.data()<<endl;
for(list<Component *>::iterator it = components.begin(); it != components.end(); ++it){
(*it)->process();
}
}
void Add(Component * component){
for(list<Component *>::iterator it = components.begin(); it != components.end(); ++it){
if(*it == component){
return;
}
}
components.push_back(component);
}
void Remove(Component * component){
for(list<Component *>::iterator it = components.begin(); it != components.end(); ++it){
if(*it == component){
components.erase(it);
return;
}
}
}
private:
list<Component *> components;
private:
string m_compositeName;
};
int main()
{
cout << "Hello World!" << endl;
Composite * Root1 = new Composite("Root1");
Composite * Root2 = new Composite("Root2");
Composite * Root3 = new Composite("Root3");
Leaf * Leaf1 = new Leaf("Leaf1");
Leaf * Leaf2 = new Leaf("Leaf2");
Root1->Add(Root2);
Root2->Add(Leaf1);
Root2->Add(Leaf2);
Root1->Add(Root3);
Root1->process();
return 0;
}