定義:提供一種方法訪問一個容器對象中各個元素,而又不暴露該對象的內部細節。 html
類型:行爲類模式 java
類圖: 算法
若是要問java中使用最多的一種模式,答案不是單例模式,也不是工廠模式,更不是策略模式,而是迭代器模式,先來看一段代碼吧: 設計模式
1
2
3
4
5
6
7
|
public
static
void
print
(
Collection
coll
)
{
Iterator
it
=
coll
.
iterator
(
)
;
while
(
it
.
hasNext
(
)
)
{
String
str
=
(
String
)
it
.
next
(
)
;
System
.
out
.
println
(
str
)
;
}
}
|
這個方法的做用是循環打印一個字符串集合,裏面就用到了迭代器模式,java語言已經完整地實現了迭代器模式,Iterator翻譯成漢語就是迭代器的意思。提到迭代器,首先它是與集合相關的,集合也叫彙集、容器等,咱們能夠將集合當作是一個能夠包容對象的容器,例如List,Set,Map,甚至數組均可以叫作集合,而迭代器的做用就是把容器中的對象一個一個地遍歷出來。 數組
迭代器模式的結構 this
代碼實現: spa
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
|
interface
Iterator
{
public
Object
next
(
)
;
public
boolean
hasNext
(
)
;
}
class
ConcreteIterator
implements
Iterator
{
private
List
list
=
new
ArrayList
(
)
;
private
int
cursor
=
0
;
public
ConcreteIterator
(
List
list
)
{
this
.
list
=
list
;
}
public
boolean
hasNext
(
)
{
if
(
cursor
==
list
.
size
(
)
)
{
return
false
;
}
return
true
;
}
public
Object
next
(
)
{
Object
obj
=
null
;
if
(
this
.
hasNext
(
)
)
{
obj
=
this
.
list
.
get
(
cursor
++
)
;
}
return
obj
;
}
}
interface
Aggregate
{
public
void
add
(
Object
obj
)
;
public
void
remove
(
Object
obj
)
;
public
Iterator
iterator
(
)
;
}
class
ConcreteAggregate
implements
Aggregate
{
private
List
list
=
new
ArrayList
(
)
;
public
void
add
(
Object
obj
)
{
list
.
add
(
obj
)
;
}
public
Iterator
iterator
(
)
{
return
new
ConcreteIterator
(
list
)
;
}
public
void
remove
(
Object
obj
)
{
list
.
remove
(
obj
)
;
}
}
public
class
Client
{
public
static
void
main
(
String
[
]
args
)
{
Aggregate
ag
=
new
ConcreteAggregate
(
)
;
ag
.
add
(
"小明"
)
;
ag
.
add
(
"小紅"
)
;
ag
.
add
(
"小剛"
)
;
Iterator
it
=
ag
.
iterator
(
)
;
while
(
it
.
hasNext
(
)
)
{
String
str
=
(
String
)
it
.
next
(
)
;
System
.
out
.
println
(
str
)
;
}
}
}
|
上面的代碼中,Aggregate是容器類接口,你們能夠想象一下Collection,List,Set等,Aggregate就是他們的簡化版,容器類接口中主要有三個方法:添加對象方法add、刪除對象方法remove、取得迭代器方法iterator。Iterator是迭代器接口,主要有兩個方法:取得迭代對象方法next,判斷是否迭代完成方法hasNext,你們能夠對比java.util.List和java.util.Iterator兩個接口自行思考。 翻譯
迭代器模式的優缺點 設計
迭代器模式的優勢有: code
迭代器模式的缺點:
迭代器模式的適用場景
迭代器模式是與集合共生共死的,通常來講,咱們只要實現一個集合,就須要同時提供這個集合的迭代器,就像java中的Collection,List、Set、Map等,這些集合都有本身的迭代器。假如咱們要實現一個這樣的新的容器,固然也須要引入迭代器模式,給咱們的容器實現一個迭代器。
可是,因爲容器與迭代器的關係太密切了,因此大多數語言在實現容器的時候都給提供了迭代器,而且這些語言提供的容器和迭代器在絕大多數狀況下就能夠知足咱們的須要,因此如今須要咱們本身去實踐迭代器模式的場景仍是比較少見的,咱們只須要使用語言中已有的容器和迭代器就能夠了。