一、迭代器模式介紹
迭代器模式:提供一種方法順序的訪問一個聚合對象中各個元素,而又不暴露該對象的內部表示。
一般情況,我們自己開發時很少自定義迭代器,因為java本身已經把迭代器做到內部中了(比如:常用的list和set中都內置了迭代器)。
當然,如果真有這種需求需要我們自定義迭代器的話,可以參考jdk的迭代器實現方式來實現自己的迭代器。
迭代器是可以從前往后,或者從后往前遍歷的。
為遍歷不同聚集結構提供如:開始,下一個,是否有下一個,是否結束,當前哪一個等等的一個統一接口。
迭代器模式UML圖:
聚集類:Aggregate(抽象類)和ConcreteAggregate(具體聚集類)表示聚集類,是用來存儲迭代器的數據。
在Aggregate(抽象類)中有一個CreateIterator方法,用來獲取迭代器
迭代器:迭代器用來為聚集類提供服務,提供了一系列訪問聚集類對象元素的方法。
二、模擬迭代器的實現
首先定義一個迭代器的抽象,這里使用接口定義
1
2
3
4
5
6
7
8
9
10
|
//迭代器接口
public
interface
MyIterator {
void
first();
//將游標指向第一個元素
void
next();
//將游標指向下一個元素
boolean
hasNext();
//判斷是否有下一個元素
boolean
isFirst();
//判斷是否是第一個元素
boolean
isLast();
//判斷是否是最后一個元素
Object getCurrentObj();
//獲取當前對象
}
|
然后自定一個一個聚集類,這里直接使用一個class來定義了。在聚集類內部,使用內部類的方式來定義迭代器的具體實現。
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
|
import
java.util.ArrayList;
import
java.util.List;
//自定義聚集類
public
class
ConcreteMyAggregate {
private
List<Object> list =
new
ArrayList<>();
public
void
addObject(Object obj){
this
.list.add(obj);
}
public
void
removeObject(Object obj){
this
.list.remove(obj);
}
public
List<Object> getList() {
return
list;
}
public
void
setList(List<Object> list) {
this
.list = list;
}
//獲得迭代器
public
MyIterator createIterator(){
return
new
ConcreteIterator();
}
//使用內部類來定義迭代器,好處就是可以直接使用外部類的屬性
private
class
ConcreteIterator
implements
MyIterator{
private
int
cursor;
//定義一個迭代器游標
@Override
public
void
first() {
cursor =
0
;
}
@Override
public
void
next() {
if
(cursor<list.size()) {
cursor++;
}
}
@Override
public
boolean
hasNext() {
//如果游標<list的大小,則說明還有下一個
if
(cursor<list.size()) {
return
true
;
}
return
false
;
}
@Override
public
boolean
isFirst() {
return
cursor==
0
?
true
:
false
;
}
@Override
public
boolean
isLast() {
//判斷游標是否是容器的最后一個
return
cursor==(list.size()-
1
)?
true
:
false
;
}
@Override
public
Object getCurrentObj() {
return
list.get(cursor);
//獲取當前游標指向的元素
}
}
}
|
客戶端測試代碼:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
public
static
void
main(String[] args) {
ConcreteMyAggregate cma =
new
ConcreteMyAggregate();
cma.addObject(
"111"
);
cma.addObject(
"222"
);
cma.addObject(
"333"
);
cma.addObject(
"444"
);
MyIterator iterator = cma.createIterator();
cma.removeObject(
"111"
);
//如果刪除一個元素的話,迭代的時候也同樣會被刪除
while
(iterator.hasNext()) {
System.out.println(iterator.getCurrentObj());
//獲取當前對象
iterator.next();
//將游標向下移
}
}
|
測試結果如下:
222
333
444
參考資料:
大話設計模式(帶目錄完整版).pdf
HEAD_FIRST設計模式(中文版).pdf
尚學堂_高淇_java300集最全視頻教程_【GOF23設計模式】