合成模式(樹狀結構)
樹狀結構的物件。
Componet為抽象類別,裡面有name的屬性,有add()、remove(),還有一個抽象方法print(),繼承的子類別一定要覆寫print()。
Leaf為樹狀結構最尾端的節點,在他的下面不會再有任何節點,所以不允許使用add()與remove()的方法。
Composite下面一定會有子節點,子節點可以是Composite也可以是Leaf,可以使用add()與remove()的方法增加子節點。
接下來我們要寫一個學校的樹狀結構
大學University -> College學院 -> Department系
XX大學 -> 電資學院 -> 通訊系
XX大學 -> 商學院 -> 會計系
Component
1
2
3
4
5
6
7
8
9
public abstract class Component {
protected String name;
public void add(Component component) {}
public void remove(Component component) {}
public abstract void print();
}
University
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
public class University extends Component{
List<Component> componentList = new ArrayList<>();
public University(String name) {
super();
this.name = name;
}
@Override
public void add(Component component) {
componentList.add(component);
}
@Override
public void remove(Component component) {
componentList.remove(component);
}
@Override
public void print() {
System.out.println("====" + name + "========");
for (Component element : componentList) {
element.print();
}
}
}
College的程式碼與University一模一樣
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
public class College extends Component{
List<Component> componentList = new ArrayList<>();
public College(String name) {
super();
this.name = name;
}
@Override
public void add(Component component) {
componentList.add(component);
}
@Override
public void remove(Component component) {
componentList.remove(component);
}
@Override
public void print() {
System.out.println("====" + name + "========");
for (Component element : componentList) {
element.print();
}
}
}
Department,葉子節點
1
2
3
4
5
6
7
8
9
10
11
public class Department extends Component {
public Department(String name) {
super();
this.name = name;
}
@Override
public void print() {
System.out.println(name);
}
}
main主程式
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
public class Test {
public static void main(String[] args) {
Component university = new University("XX大學");
Component eletricCollege = new College("電資學院");
Department edpt1 = new Department("通訊系");
Department edpt2 = new Department("資工系");
Department edpt3 = new Department("電機系");
eletricCollege.add(edpt1);
eletricCollege.add(edpt2);
eletricCollege.add(edpt3);
Component businessCollege = new College("商學院");
Department bdpt1 = new Department("會計系");
Department bdpt2 = new Department("國貿系");
Department bdpt3 = new Department("應用數學系");
businessCollege.add(bdpt1);
businessCollege.add(bdpt2);
businessCollege.add(bdpt3);
university.add(eletricCollege);
university.add(businessCollege);
university.print();
}
}
====XX大學========
====電資學院========
通訊系
資工系
電機系
====商學院========
會計系
國貿系
應用數學系