1、模式定义; |7 P" L+ z+ m( s7 u2 c
迭代器模式(Iterator Pattern) :提供一种方法来访问聚合对象,而不用暴露这个对象的内部表示,其别名为游标(Cursor)。迭代器模式是一种对象行为型模式。
- ^' l+ b# w! _6 g, V$ P
0 c0 z/ N, o# x3 Y2、模式结构
0 K J" r) g" X: ~! R迭代器模式包含如下角色:4 ?1 J# r3 `! x$ \, f# f* ~* G
Iterator: 抽象迭代器9 o8 V& T! J# r% O, G* k2 n
ConcreteIterator: 具体迭代器9 E. w( E2 D# c- }
Aggregate: 抽象聚合类: h$ y i7 q$ O) f$ D( \- [
ConcreteAggregate: 具体聚合类
K6 S4 a" L2 n7 ~+ G3、模式分析& w3 K$ |. ~1 S# a2 d
聚合是一个管理和组织数据对象的数据结构。- j6 h( u6 A+ E3 w% Q
聚合对象主要拥有两个职责:一是存储内部数据;二是遍历内部数据。 8 l. s2 }( V- K* i
存储数据是聚合对象最基本的职责。0 Y; Z$ h' B$ q" ]6 m7 d5 }
将遍历聚合对象中数据的行为提取出来,封装到一个迭代器中,通过专门的迭代器来遍历聚合对象的内部数据,这就是迭代器模式的本质。迭代器模式是“单一职责原则”的完美体现。8 ` ^5 ?; v) C7 q9 w# k) ~/ I6 I
8 [$ T& G- |1 b2 }7 K' s' \+ B模式分析. ~4 }- D! z. R1 ~4 A! ^: G) M5 B
自定义迭代器
- b; S& _# y1 o5 m; O: |3 RMyIterator——抽象迭代器; P/ X' Q3 K7 ], e$ |1 X
MyCollection——抽象聚合类$ k+ @ R/ M& R" ^8 b o- T: W
NewCollection——具体聚合类
; C2 t9 x8 m2 Z% }2 i2 ZNewIterator——具体迭代器+ [$ z" x' _$ M- {3 }
Client
1 e7 ~6 s- [) ~ Y# R0 Z( Q- public class ConcreteIterator implements Iterator0 f y( g) E* a6 w- `
- {
( { N9 l2 v$ @0 M7 d2 B - private ConcreteAggregate objects;' r. B5 I/ S6 c9 N, o- z6 R
-
6 T; _& I5 P P* X0 D9 d - public ConcreteIterator(ConcreteAggregate objects)
. B S. c7 S% P2 t - {
+ h5 w% }; k( x6 V# x - this.objects=objects;. L+ n. r: L1 \# P# d0 ]: y- c2 ?
- }
1 T/ v: f6 @( G0 o; v - public void first()
/ k) V$ @- [, n, Z1 [- r a0 ^ - { ...... }
- X2 V n4 i$ n3 W& b; C - - C- b$ s2 K, W+ E/ l5 v
- public void next()
! F5 l, ^/ b3 b - { ...... }5 ?! p; o+ ]* t" M2 z% C6 ^
- public boolean hasNext()! J& H+ f& z8 [) ?- j+ U( `
- { ...... }
* Y3 b, z, ]4 t, X! u/ @ -
- Q& b+ ?( O5 ~0 d( m7 L3 o# D - public Object currentItem()6 p i7 j. J. o" d3 ?$ _ c7 a
- { ...... }
. N) R2 J. ?/ H0 o5 I0 R - }
. c1 x- i- g0 ^, q. u - public class ConcreteAggregate implements Aggregate
4 S% k$ u( X/ C. G$ d - {
5 a, @% o1 X7 \* E# \ D - ...... + }6 I/ D4 s w+ P! x$ t
- public Iterator createIterator()
3 q3 e5 d/ ?* F, @* C; v7 y - {
* P i& @* z0 r- X4 L - return new ConcreteIterator(this);$ F3 }& W' Q: w. L
- }
. K7 y# Y/ V, S6 R% a+ Q - ......
3 n6 o b0 {: U8 ^, l; J - }3 |3 t9 f B7 {8 z4 u
复制代码 在迭代器模式中应用了工厂方法模式,聚合类充当工厂类,而迭代器充当产品类,由于定义了抽象层,系统的扩展性很好,在客户端可以针对抽象聚合类和抽象迭代器进行编程。
: j! q3 o" d3 F. u' {+ M' ~, f, `! m由于很多编程语言的类库都已经实现了迭代器模式,因此在实际使用中我们很少自定义迭代器,只需要直接使用Java、C#等语言中已定义好的迭代器即可,迭代器已经成为我们操作聚合对象的基本工具之一。, [: h$ f& u5 I1 f: U
" s1 Y5 `) `" o8 t/ t( v& {4、模式优缺点" V, E1 T; r3 x
迭代器模式的优点
+ l' I0 n+ j8 `4 F! O2 C它支持以不同的方式遍历一个聚合对象。- b/ C8 R, F( g9 m
迭代器简化了聚合类。8 u+ B, [( q5 z o: U3 J2 L
在同一个聚合上可以有多个遍历。' H: E0 |4 e& E2 k+ r P+ G% r0 U4 z
在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码,满足“开闭原则”的要求。 迭代器模式的缺点
A c0 b1 \2 P由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性。
) `! ~4 z3 D! `* e6 y y 5、模式适用环境# L' b+ D8 p5 [& {3 |6 y
在以下情况下可以使用迭代器模式:: s. ?- x9 A0 y4 I
访问一个聚合对象的内容而无须暴露它的内部表示。
" i5 W5 ~/ g7 ^) Q6 x需要为聚合对象提供多种遍历方式。$ l# j4 z: J0 ~1 W8 k
为遍历不同的聚合结构提供一个统一的接口。
! a7 |6 z# W; F- `
% a: P, ~5 b' G |