1. 基本概念

组合模式是一种结构型设计模式,它将对象组合成树状结构来表示“部分-整体”的层次关系。组合模式使得客户端可以统一处理单个对象和对象的组合,而无需区分它们的具体类型。

2. 基本结构

组合模式包括下面几个角色:

image-20240513220154103

理解起来比较抽象,我们用“省份-城市”举个例子,省份中包含了多个城市,如果将之比喻成一个树形结构,城市就是叶子节点,它是省份的组成部分,而“省份”就是合成节点,可以包含其他城市,形成一个整体,省份和城市都是组件,它们都有一个共同的操作,比如获取信息。

  • Component组件: 组合模式的“根节点”,定义组合中所有对象的通用接口,可以是抽象类或接口。该类中定义了子类的共性内容。
  • Leaf叶子:实现了Component接口的叶子节点,表示组合中的叶子对象,叶子节点没有子节点。
  • Composite合成: 作用是存储子部件,并且在Composite中实现了对子部件的相关操作,比如添加、删除、获取子组件等。

通过组合模式,整个省份的获取信息操作可以一次性地执行,而无需关心省份中的具体城市。这样就实现了对国家省份和城市的管理和操作。

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
// 组件接口
interface Component {
void operation();
}

// 叶子节点
class Leaf implements Component {
@Override
public void operation() {
System.out.println("Leaf operation");
}
}

// 组合节点:包含叶子节点的操作行为
class Composite implements Component {
private List<Component> components = new ArrayList<>();

public void add(Component component) {
components.add(component);
}

public void remove(Component component) {
components.remove(component);
}

@Override
public void operation() {
System.out.println("Composite operation");
for (Component component : components) {
component.operation();
}
}
}

// 客户端代码
public class Client {
public static void main(String[] args) {
// 创建叶子节点
Leaf leaf = new Leaf();
// 创建组合节点,并添加叶子节点
Composite composite = new Composite();
composite.add(leaf);

composite.operation(); // 统一调用
}
}

4. 使用场景

组合模式可以使得客户端可以统一处理单个对象和组合对象,无需区分它们之间的差异,比如在图形编辑器中,图形对象可以是简单的线、圆形,也可以是复杂的组合图形,这个时候可以对组合节点添加统一的操作。

总的来说,组合模式适用于任何需要构建具有部分-整体层次结构的场景,比如组织架构管理、文件系统的文件和文件夹组织等。


本站由 卡卡龙 使用 Stellar 1.27.0 主题创建

本站访问量 次. 本文阅读量 次.