-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathcomposite.cpp
94 lines (79 loc) · 2.24 KB
/
composite.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
/*!
* \brief. Composite. Compose objects into tree structures
* to represent part-whole hierarchies.Composite lets
* clients treat individual objects and compositions
* of objects uniformly.
*
* Component Leader
* | | | |
* Leaf Composite Member Leader
* | |
* Member Member
*/
#include <iostream>
#include <string>
#include <list>
// Component.
class Component {
public:
Component(char* name) :name_(name) {}
virtual void Add(Component* cpn) {}
virtual void Remove(Component* cpn) {}
virtual void Display(std::string str) {}
protected:
char* name_;
std::list<Component* > list_;
};
// Composite.
class Leader :public Component {
public:
Leader(char* name) :Component(name) {}
virtual void Add(Component* cpn) {
if (cpn != NULL) {
list_.push_back(cpn);
}
}
virtual void Remove(Component* cpn) {
if (cpn != NULL) {
list_.remove(cpn);
}
}
virtual void Display(std::string str) {
std::cout << str << name_ << std::endl;
str = str + str;
std::list<Component*>::iterator iter = list_.begin();
for (; iter != list_.end(); iter++) {
(*iter)->Display(str);
}
}
};
// Leaf.
class Member :public Component {
public:
Member(char* name) :Component(name) {}
void Display(std::string str) {
std::cout << str << name_ << std::endl;
}
};
void main() {
Leader *root0 = new Leader("Majordomo");
Member *leaf_0a = new Member("Majordomo's assistant");
Member *leaf_0b = new Member("Majordomo's secretary");
root0->Add(leaf_0a);
root0->Add(leaf_0b);
Leader *node1 = new Leader("Department Manager");
root0->Add(node1);
Member *leaf_1a = new Member("Engineer A");
Member *leaf_1b = new Member("Engineer B");
node1->Add(leaf_1a);
node1->Add(leaf_1b);
root0->Display("--");
std::cout << "//////////////////////////////" << std::endl << std::endl;
root0->Remove(leaf_0a);
root0->Display("==");
std::cout << "//////////////////////////////" << std::endl << std::endl;
root0->Remove(node1);
root0->Display("--");
std::cout << "//////////////////////////////" << std::endl;
return;
}