定义:提供一种方法访问一个容器对象中各个元素,而又不暴露该对象的内部细节。 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等,这些集合都有本身的迭代器。假如咱们要实现一个这样的新的容器,固然也须要引入迭代器模式,给咱们的容器实现一个迭代器。
可是,因为容器与迭代器的关系太密切了,因此大多数语言在实现容器的时候都给提供了迭代器,而且这些语言提供的容器和迭代器在绝大多数状况下就能够知足咱们的须要,因此如今须要咱们本身去实践迭代器模式的场景仍是比较少见的,咱们只须要使用语言中已有的容器和迭代器就能够了。