组合模式

组合模式

属于结构型模式

组合模式又叫部分整体模式,它创建了对象组的树形结构, 将对象组成树状结构来表示整体的层次关系

为什么使用组合模式

组合模式能够使用户对单个对象和组合对象的访问具有一致性

有时候功能的扩展对象可能是包含关系, 而不是继承关系, 需要使用组合模式

使用组合模式

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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
// 组织, 大学 学院 部门都继承组织
public abstract class Origanization {
public Origanization(String name, String info) {
this.name = name;
this.info = info;
}
private String name;
private String info;
public void add(Origanization origanization){
System.out.println("添加: "+origanization.name);
}
public void remove(Origanization origanization){
System.out.println("移除: "+origanization.name);
}
public abstract void print();
@Override
public String toString() {
return "Origanization{" +
"name='" + name + '\'' +
", info='" + info + '\'' +
'}';
}
}

// 大学
public class University extends Origanization{
// 管理学院
List<Origanization> list=new ArrayList<>();
@Override
public void add(Origanization origanization) {
list.add(origanization);
}
@Override
public void remove(Origanization origanization) {
list.remove(origanization);
}
public University(String name, String info) {
super(name, info);
}
// 输出包含的学院
@Override
public void print() {
System.out.println("----"+this+"----");
for(Origanization origanization: list){
origanization.print();
}
}
}

// 学院
public class College extends Origanization{
//管理部门
List<Origanization> list=new ArrayList<>();

@Override
public void add(Origanization origanization) {
list.add(origanization);
}

@Override
public void remove(Origanization origanization) {
list.remove(origanization);
}


public College(String name, String info) {
super(name, info);
}

@Override
public void print() {
System.out.println("--"+this+"--");
for(Origanization origanization: list){
origanization.print();
}
}
}

// 部门 叶子节点
public class Department extends Origanization{
public Department(String name, String info) {
super(name, info);
}

@Override
public void print() {
System.out.println(this);
}
}

// 测试
@Test
public void testComposite(){
Origanization university = new University("浙江大学","大学");
Origanization college1 = new College("计算机学院","学院");
Origanization college2 = new College("国际学院","学院");
university.add(college1);
university.add(college2);
Origanization department1 = new Department("信息工程","部门");
Origanization department2 = new Department("软件工程","部门");
college1.add(department1);
college1.add(department2);
Origanization department3 = new Department("国际英语","部门");
Origanization department4 = new Department("商务英语","部门");
college2.add(department3);
college2.add(department4);
university.print();
}