设计模式之 组合模式

Composite

属于 数据结构 模式

将对象组合成 树形结构 以表示 部分-整体 的层次结构 使得用户对单个对象和组合对象的使用具有一致性(稳定)

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
class  {
public:
virtual void process() = 0;
virtual ~Component() { }
};

class Composite : public Component{
string name;
list<Component*> elements; // 存储的是指针 多态
public:
Composite(const string &s) : name(s) {}
void add(Component *element) {
elements.push_back(element);
}
void remove(Component *element) {
elements.remove(element);
}
void process() {
// 1. process current node
/* ... */
// 2. process leaf nodes
for (auto &e : elements) {
e->process(); // 多态调用
}
}
};
// 叶子节点
class Leaf : public Component {
string name;
public:
Leaf(string s) : name(s) { }
void process() {
// process current node
}
};
void Invoke(Component &c) {
/* ... */
c.process();
/* ... */
}
int main() {
Composite root("root");
Composite treeNode1("treeNode1");
Composite treeNode2("treeNode2");
Composite treeNode3("treeNode3");
Composite treeNode4("treeNode4");
Leaf leat1("left1");
Leaf leat2("left2");

root.add(&treeNode1);
treeNode1.add(&treeNode2);
treeNode2.add(&leaf1);

root.add(&treeNode3);
treeNode3.add(&treeNode4);
treeNode4.add(&leaf2);

// 不管是根节点还是叶子节点 都能直接处理 这就是一致性
Invoke(root);
Invoke(leaf2);
Invoke(treeNode3);
}