组合模式-c++
#include <iostream> #include <string> #include <list> using namespace std; class Component { protected: string name; public: Component(string name) :name(name) { } virtual void AddComponent(Component *component) { } virtual void RemoveComponent(Component *component) { } virtual void GetChild(int depth) { } }; class Leaf : public Component { public: Leaf(string name) :Component(name) { } void AddComponent(Component *component) { cout << "can't add" << endl; } void RemoveComponent(Component *component) { cout << "can't remove" << endl; } void GetChild(int depth) { string _tmpstring(depth, '-'); cout << _tmpstring << name << endl; } }; class Composite :public Component { private: list<Component*> _componets; public: Composite(string name) :Component(name) { } void AddComponent(Component *component) { _componets.push_back(component); } void RemoveComponent(Component *component) { _componets.remove(component); } void GetChild(int depth) { string tmpstring(depth, '-'); cout << tmpstring << name << endl; list<Component*>::iterator iter = _componets.begin(); for (; iter != _componets.end(); iter++) { (*iter)->GetChild(depth + 2); } } }; int main() { Composite *root = new Composite("root"); Leaf *leaf1 = new Leaf("A"); Leaf *leaf2 = new Leaf("B"); root->AddComponent(leaf1); root->AddComponent(leaf2); Composite *lay2 = new Composite("AA"); Leaf *leaf4 = new Leaf("BB"); lay2->AddComponent(leaf4); Composite *lay1 = new Composite("CC"); Leaf *leaf3 = new Leaf("C"); lay1->AddComponent(leaf3); lay1->AddComponent(lay2); root->AddComponent(lay1); root->GetChild(1); cout << endl; lay1->GetChild(1); cout << endl; lay2->GetChild(1); delete root; delete lay1; delete lay2; delete leaf1; delete leaf2; delete leaf3; delete leaf4; }