1、模式定义
/ n* p5 @5 O, y0 t3 z迭代器模式(Iterator Pattern) :提供一种方法来访问聚合对象,而不用暴露这个对象的内部表示,其别名为游标(Cursor)。迭代器模式是一种对象行为型模式。
6 l+ \& C& K) V$ M% V: C) F/ E; Q) Q/ T7 a5 g5 E
2、模式结构
! ?4 @% ?6 h6 t: j. @ N迭代器模式包含如下角色:
1 L$ ?# g2 Z# b MIterator: 抽象迭代器8 ?6 ~$ R7 E9 A, o \
ConcreteIterator: 具体迭代器( Y0 B- {1 x u( j/ P* F0 K- T
Aggregate: 抽象聚合类
* S$ J: ? G% sConcreteAggregate: 具体聚合类5 D V2 ?* b+ Z. C0 Y
3、模式分析
0 y# B; G4 D2 I1 @" j r" ~$ p& |聚合是一个管理和组织数据对象的数据结构。: D5 C9 \! E0 q% m% Q2 [
聚合对象主要拥有两个职责:一是存储内部数据;二是遍历内部数据。
' G2 ^ _( r2 c$ j存储数据是聚合对象最基本的职责。
; b- J8 x1 ^& z. U" o将遍历聚合对象中数据的行为提取出来,封装到一个迭代器中,通过专门的迭代器来遍历聚合对象的内部数据,这就是迭代器模式的本质。迭代器模式是“单一职责原则”的完美体现。5 K4 B$ Z4 o4 w2 e5 e
, s! [9 O5 y' }5 _. o \1 k* @
模式分析4 |9 W3 W- O; Q6 l
自定义迭代器
E( Y" S2 h+ PMyIterator——抽象迭代器; M0 w, ?( m% {+ c- n- [' c* _
MyCollection——抽象聚合类
! i6 a4 M# q! _3 Z; @7 H3 `5 {NewCollection——具体聚合类
# O& l4 w7 \: d% ` o" p- K! TNewIterator——具体迭代器- R# X/ e5 B1 @* X. N4 W
Client
/ M- Y5 }# \ ?: C- public class ConcreteIterator implements Iterator
/ e! S0 h9 O2 n# I - {
. m9 n4 v% M) v- _# |& Z/ X5 M - private ConcreteAggregate objects;" p! @! C8 `3 ~6 r% }
-
2 u" U) ]# a3 W' \3 i/ x - public ConcreteIterator(ConcreteAggregate objects)
6 ]% y; N% M, r1 c/ j! O3 o - {
; t4 D+ [4 |( t4 e! U) } - this.objects=objects;
: P* g. V+ r, U - }4 d3 }" B; a! g7 G6 Z: f. j' `
- public void first()
4 `( ~6 I3 N9 Y8 r+ A - { ...... }
" [' O2 j1 I7 b7 g1 x- g$ m5 U - L7 B* l! c8 C7 k; X, z8 Y8 x" P0 c
- public void next()
6 Y+ D" L* o# ]+ J1 m* L0 A& Z - { ...... }
- S I: _3 e- y% R7 r; _ - public boolean hasNext()
1 R. R) g0 o2 {& B1 H - { ...... }
9 l" r- m$ E+ O1 c( S' p1 F - ( H6 Q8 I- g' x$ r4 S" ~8 P
- public Object currentItem()
, y2 j3 e0 y4 u+ S6 z - { ...... }0 t/ z+ e: O* J
- }5 X1 S* ?$ F' z" T/ w4 G
- public class ConcreteAggregate implements Aggregate
, t9 }1 J$ }: n2 @5 \ - {
$ a. e* O! V3 s* g9 s - ......
2 y% ^# z6 S- Z! n8 |, L7 Z - public Iterator createIterator()
4 u3 T" W1 `2 [& p: T: N' E6 T& ` - {2 X( @0 j- s! h1 K! N2 l/ @
- return new ConcreteIterator(this);; l0 Q# m; H y( J) A
- }
' n9 K7 K3 j! g4 |5 w& V( X - ......- g) ?7 G8 x" Y( F+ i8 p6 n
- }. v8 [; n( ]* r
复制代码 在迭代器模式中应用了工厂方法模式,聚合类充当工厂类,而迭代器充当产品类,由于定义了抽象层,系统的扩展性很好,在客户端可以针对抽象聚合类和抽象迭代器进行编程。/ n0 [/ q) | `& h* X9 G8 {+ ^& M+ ?
由于很多编程语言的类库都已经实现了迭代器模式,因此在实际使用中我们很少自定义迭代器,只需要直接使用Java、C#等语言中已定义好的迭代器即可,迭代器已经成为我们操作聚合对象的基本工具之一。: G) A, U# l7 h4 Z! ]
\* R5 ~/ e. x) \. q! {4、模式优缺点: M' q3 D( L3 l$ [& E$ `
迭代器模式的优点
0 z( q$ y3 n; j8 b: k4 v: V5 z它支持以不同的方式遍历一个聚合对象。' U$ h' H% h4 E
迭代器简化了聚合类。
( O7 d: s3 `7 {在同一个聚合上可以有多个遍历。
0 o- F# I! l! Q( T1 c在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码,满足“开闭原则”的要求。 迭代器模式的缺点
1 n9 Z8 o0 M' R5 K5 M由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性。
' k4 |5 a/ s8 Z5 F( Y @ 5、模式适用环境
! w# z5 @+ X+ |- [2 E: n' g在以下情况下可以使用迭代器模式:1 u ?' Y c7 x$ H$ k
访问一个聚合对象的内容而无须暴露它的内部表示。% d8 L# e* d- W$ p1 Q& K d
需要为聚合对象提供多种遍历方式。
% d2 y& o) E: Z: N9 w3 e( E8 D" N为遍历不同的聚合结构提供一个统一的接口。
' @: S. I+ t: o0 q
+ C0 `( c, i& k: Y& O0 C |