1、組合模式介紹html
組合模式:將對象組合成樹形結構以表示:部分--總體 的層次結構。組合模式使得用戶對單個對象和組合對象的使用具備一致性。java
java中的組合是指:在A類裏定義一個B類的引用,A擁有了B,叫組合。只是單純的組合而已,而不是一種設計模式。設計模式
組合和組合模式不是一回事!app
基本上見到的樹形結構都使用到了組合模式。框架
組合模式結構圖:ide
組合模式中有幾個核心的部分:post
Leaf(葉子):表示該節點下面沒有其餘子節點了,就稱爲葉子單元測試
Compostie(容器構件):容器構件,該節點下還有其餘子節點,理解爲一個容器,裏面包含了其餘子節點。就叫作容器構件學習
Component(抽象構件):抽象構件中定義了葉子和容器構件的共同點。好比,有公共的添加刪除葉子功能,有顯示節點功能。測試
例如:Windows中的文件管理
2、組合模式代碼實現
首先,定義一個抽象的Component。提供一系列的公共接口
1
2
3
4
5
6
7
8
9
10
11
|
//Component(抽象構件):抽象構件中定義了葉子和容器構件的共同點。好比,有公共的添加刪除葉子功能,有顯示節點功能。
public
abstract
class
Component {
protected
String name;
public
Component(String name) {
super
();
this
.name = name;
}
public
abstract
void
add(Component c);
public
abstract
void
remove(Component c);
public
abstract
void
display(
int
depth);
}
|
而後定義具體的葉子節點,和容器節點
定義葉子節點,因爲葉子節點中沒有子節點了,因此不須要add和remove的具體實現
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
//表示該節點下面沒有其餘子節點了,就稱爲葉子
public
class
Leaf
extends
Component {
public
Leaf(String name) {
super
(name);
}
@Override
public
void
add(Component c) {
System.out.println(
"leaf no add"
);
}
@Override
public
void
remove(Component c) {
System.out.println(
"leaf no remove"
);
}
@Override
public
void
display(
int
depth) {
StringBuffer sb =
new
StringBuffer(
"-"
);
for
(
int
i =
0
; i <= depth; i++) {
sb.append(
"-"
);
}
System.out.println(sb.toString()+name);
}
}
|
再定義一個容器節點
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
|
import
java.util.ArrayList;
import
java.util.List;
//容器構件,該節點下還有其餘子節點,理解爲一個容器,裏面包含了其餘子節點。就叫作容器構件
public
class
Composite
extends
Component{
private
List<Component> children =
new
ArrayList<Component>();
public
Composite(String name) {
super
(name);
}
@Override
public
void
add(Component c) {
children.add(c);
}
@Override
public
void
remove(Component c) {
children.remove(c);
}
@Override
public
void
display(
int
depth) {
StringBuffer sb =
new
StringBuffer(
"-"
);
for
(
int
i =
0
; i <= depth; i++) {
sb.append(
"-"
);
}
System.out.println(sb.toString()+name);
for
(Component com : children) {
com.display(depth +
2
);
}
}
}
|
最後客戶端測試代碼:添加一個樹形結構
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
public
static
void
main(String[] args) {
Composite root =
new
Composite(
"root"
);
root.add(
new
Leaf(
"Leaf A"
));
root.add(
new
Leaf(
"Leaf B"
));
Composite comp =
new
Composite(
"Composite X"
);
comp.add(
new
Leaf(
"Leaf XA"
));
comp.add(
new
Leaf(
"Leaf XB"
));
root.add(comp);
Composite comp2 =
new
Composite(
"Composite XY"
);
comp2.add(
new
Leaf(
"Leaf XYA"
));
comp2.add(
new
Leaf(
"Leaf XYB"
));
comp.add(comp2);
root.add(
new
Leaf(
"Leaf C"
));
Leaf leaf =
new
Leaf(
"Leaf D"
);
root.add(leaf);
// root.remove(leaf);//這裏能夠刪除某節點
root.display(
1
);
}
|
打印結果以下:
---root
-----Leaf A
-----Leaf B
-----Composite X
-------Leaf XA
-------Leaf XB
-------Composite XY
---------Leaf XYA
---------Leaf XYB
-----Leaf C
-----Leaf D
3、總結
開發中應用場景:
操做系統中的資源管理器
GUI中的容器層次圖
XML文件解析
OA系統中,組織結構的處理
Junit單元測試框架
參考資料:
大話設計模式(帶目錄完整版).pdf
HEAD_FIRST設計模式(中文版).pdf
尚學堂_高淇_java300集最全視頻教程_【GOF23設計模式】