设计模式之组合模式

组合模式(Composite Pattern),将对象组合成树形结构以表示 部分-整体 的层次结构,使得用户对单个对象和组合对象的使用具有一致性,属于结构型模式。

组成

组合模式由抽象接口 Component 、 叶节点对象 Leaf 和枝节点对象 Composite 组成。

其中 Component 声明接口,也可以实现共有接口的默认行为;Leaf 实现 Component 接口,没有子节点;Composite 同样实现 Component 接口,且持有 Leaf 子节点。

优点

客户端可以一致地使用组合结构和单个对象,调用简单。

容易在组合体内加入新对象,客户端不必因为加入新对象而更修改代码。

缺点

使设计更加抽象,对象的业务规则如果很复杂,实现组合模式具有很大挑战性,而且不是所有的方法都与叶子对象有关联。

使用场景

需要表示 部分-整体 的层次结构,且希望通过一种方式忽略整体与部分的差异、一致对待时,可以使用组合模式。

设计原则

遵循依赖倒转原则、开闭原则,破坏接口隔离原则。

示例代码

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
public class CompanyComponent {

protected String name;

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

public void add(CompanyComponent company) {}

public void remove(CompanyComponent company) {}

public void display(String prefix) {
System.out.println(prefix + name);
}
}

public class ConcreteCompanyComposite extends CompanyComponent {

private List<CompanyComponent> companies = new ArrayList<>();

public ConcreteCompanyComposite(String name) {
super(name);
}

@Override
public void add(CompanyComponent company) {
companies.add(company);
}

@Override
public void remove(CompanyComponent company) {
companies.remove(company);
}

@Override
public void display(String prefix) {
super.display(prefix);
companies.forEach(company -> company.display(prefix + "-"));
}
}

public class HRDepartmentLeaf extends CompanyComponent {
public HRDepartmentLeaf(String name) {
super(name);
}
}

public class Client {
public static void main(String[] args) {
CompanyComponent root = new ConcreteCompanyComposite("北京总公司");
root.add(new HRDepartmentLeaf("总公司人力资源部"));

CompanyComponent company1 = new ConcreteCompanyComposite("上海分公司");
company1.add(new HRDepartmentLeaf("上海分公司人力资源部"));
root.add(company1);

CompanyComponent company2 = new ConcreteCompanyComposite("武汉分公司");
company2.add(new HRDepartmentLeaf("武汉分公司人力资源部"));
root.add(company2);

root.display("-");
}
}
打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • © 2016-2020 姜越

谢谢老板

支付宝
微信