结构型设计模式的一种

【DP】定义

将对象组合成树形结构以表示“部分-整体”的关系。组合模式使得用户对单个对象和组合对象的使用具有一致性。

使用场景

  1. 想要表达对象的部分-整体层次结构时,主要是树形结构
  2. 希望客户端调用是能够忽略组合对象和单个对象的不同,能统一使用一套方法

类图

组合模式

该类图的核心是简单类和组合类继承同一个抽象类,即简单类和组合类使用同一套方法,使客户端能够忽略对象的不一致。

举例

假设要设计一个目录结构,目录中文件夹和文件,文件夹下有文件夹或文件,那么使用组合模式设计就会如下:

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
/**
* 抽象的目录Component
*/
public abstract class AbsDirFile {
// 公共属性,名称
private String name;
public void setName(String name) {
this.name = name;
}

// 在抽象类中声明方法
public abstract void add(AbsDirFile dirFile);
public abstract void remove(AbsDirFile dirFile);
}
/**
* 文件夹类,组合类
*/
public class Directory extends AbsDirFile{
private List<AbsDirFile> subDirFiles = new ArrayList<>();

@Override
public void add(AbsDirFile dirFile) {
subDirFiles.add(dirFile);
}

@Override
public void remove(AbsDirFile dirFile) {
subDirFiles.remove(dirFile);
}
}
/**
* 文件类
*/
public class File extends AbsDirFile{
@Override
public void add(AbsDirFile dirFile) {
// do nothing
}

@Override
public void remove(AbsDirFile dirFile) {
// do nothing
}
}

这样设计,对于目录树上的任何一个对象都有同一套接口,就能够避免在客户端判断类型。

注意事项

  1. 从客户端调用的易用性和简便性上来思考组合模式会更容易理解和记忆