参考文献

组合模式

  • 允许将对象组织成树形结构,以表示“整体-部分”层次关系,并且能够以统一的方式处理单个对象和组合对象.

组件

  • 组件(Component):抽象类或接口,定义了组合中所有对象共有的操作,可以是抽象类或接口.它可以包含对子组件进行管理的方法,比如添加、删除、获取子组件等.
  • 叶子节点(Leaf):代表组合中的叶子对象,叶子节点没有子节点,实现了组件的操作方法.
  • 容器节点(Composite):代表组合中的容器对象,可以包含子节点,实现了组件的操作方法.容器节点可以存储叶子节点和其他容器节点,形成树形结构.
  • 客户端(Client):使用组合模式的外部代码,通过组件接口操作组合对象.客户端通常无法区分处理的是单个对象还是组合对象,因为它们都遵循同样的接口

实现方式

  • 使用抽象类或接口定义组件(Component),其中包含对子组件的管理方法,如添加、删除、获取子组件等.
  • 创建叶子节点(Leaf)类,实现组件接口并实现相关操作方法.叶子节点表示组合中的叶子对象,它没有子节点.
  • 创建容器节点(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
// 组件接口
interface Component {
void operation();
}

// 叶子节点类
class Leaf implements Component {
private String name;

public Leaf(String name) {
this.name = name;
}

@Override
public void operation() {
System.out.println("执行叶子节点 " + name + " 的操作");
}
}

// 容器节点类
class Composite implements Component {
private List<Component> children = new ArrayList<>();

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

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

@Override
public void operation() {
System.out.println("执行容器节点的操作");
for (Component child : children) {
child.operation();
}
}
}

// 客户端使用组合模式
public class Client {
public static void main(String[] args) {
// 创建叶子节点
Component leaf1 = new Leaf("Leaf 1");
Component leaf2 = new Leaf("Leaf 2");

// 创建容器节点
Composite composite = new Composite();
composite.add(leaf1);
composite.add(leaf2);

// 执行操作
composite.operation();
}
}

使用场景

  • 需要表示对象的层次结构,并希望以统一的方式对单个对象和组合对象进行操作.
  • 需要对一个对象集合进行递归操作,并且不关心其具体类型.
  • 希望客户端能够以一致的方式处理组合对象和单个对象.
  • 需要灵活地组织和管理对象的层次结构.
  • 需要对树形结构进行遍历、搜索、过滤等操作.
  • 实际场景举例:
    • 文件系统中的目录和文件的层次结构.
    • 组织机构中的部门和员工的关系.
    • 菜单和子菜单的层次结构.