0%

组合模式

组合模式

将对象组合成树形结构表示”部分-整体“的层次结构,使得用户对单个对象和组合对象的使用具有一致性

树形目录结构

核心概念

组合模式

  • 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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
/**
* 抽象组件
* @author zh
* @date 2022/10/15 18:15
*/
public abstract class Component {

// 业务方法
public abstract void doSomething();

// 添加子节点,默认实现
public void addChild(Component child){
throw new UnsupportedOperationException();
}

// 移除子节点,默认实现
public void removeChild(Component child){
throw new UnsupportedOperationException();
}

// 获取子节点,默认实现
public Component getChild(int index){
throw new UnsupportedOperationException();
}
}

/**
* 组合对象
* @author zh
* @date 2022/10/15 18:15
*/
public class Composite extends Component {
private List<Component> childs = new ArrayList<>();
@Override
public void doSomething() {
for(Component component : childs){
component.doSomething();
}
}

@Override
public void addChild(Component child) {
childs.add(child);
}

@Override
public void removeChild(Component child) {
if(childs.size() > 0){
childs.remove(child);
}
}

@Override
public Component getChild(int index) {
if(childs.size() > 0 && index <= childs.size()){
return childs.get(index);
}
return null;
}
}

public class Leaf extends Component{

private String name;

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

@Override
public void doSomething() {
System.out.println("My name is "+ name);
}
}

优缺点

优点

  • 定义了包含基本对象和组合对象的类层次结构
  • 统一了组合对象和叶子对象
  • 简化了客户端的调用

缺点

使用场景

  • 想表示对象的部分-整体层次结构,把整体和部分的操作统一起来,使得层次结构更简单
  • 希望统一地使用组合结构中的所有对象
  • 为单个对象与复合对象提供统一的接口

欢迎关注我的其它发布渠道