组合模式

组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。

这种模式创建了一个包含自己对象组的类。该类提供了修改相同对象组的方式。

类图示例

组合模式.png

举个例子

公司管理系统

代码实现

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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
import java.util.ArrayList;
import java.util.List;

//公司抽象类
abstract class Company{
protected String name;
public Company(String name){
this.name = name;
}
public abstract void Add(Company c);
public abstract void Remove(Company c);
public abstract void Display(int depth);
public abstract void LineOfDuty();
}

//具体公司
class ConcreteCompany extends Company{
private List<Company> children = new ArrayList<>();
public ConcreteCompany(String name){
super(name);
}
public void Add(Company c){
children.add(c);
}
public void Remove(Company c){
children.remove(c);
}
public void Display(int depth){
System.out.println("-".repeat(depth)+name);
for(Company c : children){
c.Display(depth+2);
}
}
public void LineOfDuty(){
for(Company c : children){
c.LineOfDuty();
}
}
}

//人力资源部
class HRDepartment extends Company{
public HRDepartment(String name){
super(name);
}
public void Add(Company c){

}
public void Remove(Company c){

}
public void Display(int depth){
System.out.println("-".repeat(depth)+name);
}
public void LineOfDuty(){
System.out.println(name+"员工招聘培训管理");
}
}
//财务部
class FinancialDepartment extends Company{
public FinancialDepartment(String name){
super(name);
}
public void Add(Company c){

}
public void Remove(Company c){

}
public void Display(int depth){
System.out.println("-".repeat(depth)+name);
}
public void LineOfDuty(){
System.out.println(name+"公司财务收支管理");
}
}

public class Composite {
public static void main(String[] args) {
ConcreteCompany root=new ConcreteCompany("北京总公司");
root.Add(new HRDepartment("北京总公司人力资源部"));
root.Add(new FinancialDepartment("北京总公司财务部"));
ConcreteCompany company1=new ConcreteCompany("上海分公司");
company1.Add(new HRDepartment("上海分公司人力资源部"));
company1.Add(new FinancialDepartment("上海分公司人力资源部"));
root.Add(company1);
ConcreteCompany company2=new ConcreteCompany("深圳分公司");
company2.Add(new HRDepartment("深圳分公司人力资源部"));
company2.Add(new FinancialDepartment("深圳分公司人力资源部"));
root.Add(company2);
root.Display(1);
root.LineOfDuty();
}
}

类图

公司管理组合模式.png

组合模式包含如下角色

  1. Component接口:定义了所有对象必须实现的操作。
  2. Leaf类:实现Component接口,代表树中的叶子节点。
  3. Composite类:也实现Component接口,并包含其他Component对象的集合。

模式分析

  • 优点
    1. 简化客户端代码:客户端可以统一处理所有类型的节点。
    2. 易于扩展:可以轻松添加新的叶子类型或树枝类型。
  • 缺点
    1. 违反依赖倒置原则:组件的声明是基于具体类而不是接口,这可能导致代码的灵活性降低。