组合模式

组合模式

1.何为组合模式

​ 组合模式将对象组合成树形结构来表示“部分–整体”层次接口。它为单个对象和容器对象提供相同的接口,使得用户对于单个对象和对象集合的使用具有一致性(稳定)

2.组合模式的意义和使用场景

​ 将用户代码和复杂的容器结构解耦是组合模式的核心思想。解耦之后用户代码纯粹与抽象接口产生依赖,而非与容器内部的实现结构产生依赖,以此来应对变化。

3.组合模式的实现

​ 由抽象基类继承出父节点类和子节点类,在重写父节点的方法时,遍历子节点去调用子节点的相应方法。以此,用户代码就只需要调用父节点的方法,就可以实现对子节点方法的调用。

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
// 组件抽象类(Component)
class Component {
public:
virtual void operation() = 0;
virtual void add(Component* component) {}
virtual void remove(Component* component) {}
virtual Component* getChild(int index) { return nullptr; }
};

// 叶子组件类(Leaf)
class Leaf : public Component {
public:
void operation() override {
// 叶子节点的操作
std::cout << "Leaf operation" << std::endl;
}
};

// 容器组件类(Composite)
class Composite : public Component {
private:
std::list<Component*> children; //list中既可以是叶子节点也可以是普通节点

public:
void operation() override {
// 容器节点的操作
std::cout << "Composite operation" << std::endl;
// 遍历所有子节点执行操作
for (auto component : children) {
component->operation();
}
}
void add(Component* component) override {
children.push_back(component);
}
void remove(Component* component) override {
children.remove(component);
}
Component* getChild(int index) override {
}
};

int main() {
Component* root = new Composite();

Component* leaf1 = new Leaf();
Component* leaf2 = new Leaf();
Component* leaf3 = new Leaf();

root->add(leaf1);

Component* subComposite = new Composite();
subComposite->add(leaf2);
subComposite->add(leaf3);

root->add(subComposite);

root->operation();


return 0;
}