组合模式(Composite Pattern)
# 组合模式(Composite Pattern)
把一组相似的对象当作一个单一的对象。如:树形菜单
- 组合模式(Composite Pattern),又叫部分整体模式,它创建了对象组的树形结构,将对象组合成树状结构以表示 “ 整体 - 部分” 的层次关系。
- 组合模式 依据树形结构来组合对象,用来表示部分以及整体层次。
- 这种类型的设计模式属于结构型模式。
- 组合模式使得 用户对单个对象和组合对象的访问具有一致性,即:组合能让客户以一致的方式处理个别对象以及组合对象

菜单
@Data
public class Menu {
private Integer id;
private String name;
public Menu(Integer id, String name) {
this.id = id;
this.name = name;
}
private List<Menu> childs = new ArrayList<>();
// 添加子菜单
void addChildMenu(Menu menu) {
childs.add(menu);
}
// 递归层级遍历
void printMenu() {
System.out.println(name);
if (childs.size() > 0) {
for (Menu child : childs) {
child.printMenu();
}
}
}
}
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
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
测试
public class MainTest {
public static void main(String[] args) {
Menu root = new Menu(1, "系统管理");
Menu role = new Menu(2, "角色管理");
root.addChildMenu(role);
role.addChildMenu(new Menu(6,"固定角色"));
role.addChildMenu(new Menu(7,"临时授权"));
Menu roleManage = new Menu(3, "用户管理");
root.addChildMenu(roleManage);
roleManage.addChildMenu(new Menu(4,"临时用户"));
roleManage.addChildMenu(new Menu(5,"注册用户"));
root.printMenu();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 应用场景
什么场景用到?
- 层级结构
- 部门组织结构
- 组合了别的对象还是组合模式吗?
Java 的集合类 - HashMap 就使用了组合模式


# 注意事项和细节
- 简化客户端操作。客户端只需要面对一致的对象而不用考虑整体部分或者节点叶子的问题。
- 具有较强的扩展性。当我们要更改组合对象时,我们只需要调整内部的层次关系,客户端不用做出任何改动.
- 方便创建出复杂的层次结构。客户端不用理会组合里面的组成细节,容易添加节点或者叶子从而创建出复杂的树形结构
- 需要遍历组织机构,或者处理的对象具有树形结构时,非常 适合使用组合模式.
- 要求较高的抽象性,如果 节点和叶子有很多差异性的话,比如很多方法和属性都不一样 , 不适合使用组合式
编辑 (opens new window)
上次更新: 2023/12/13, 06:06:02