1、模式定义
% M+ {! i4 k. h9 j' i- U迭代器模式(Iterator Pattern) :提供一种方法来访问聚合对象,而不用暴露这个对象的内部表示,其别名为游标(Cursor)。迭代器模式是一种对象行为型模式。
: }( ~4 O d6 @! S& Q7 r/ z) M2 f2 U S9 V Z* L7 r* ~
2、模式结构9 w( z7 O8 X) [+ c% t& r
迭代器模式包含如下角色:
* m8 R" D0 i3 Y" r# v* y1 ]Iterator: 抽象迭代器' y, p6 R5 S# D8 e
ConcreteIterator: 具体迭代器- E. X4 n8 h: ~% Y- s" Z
Aggregate: 抽象聚合类
- ^2 a( {; ~) j- ]9 yConcreteAggregate: 具体聚合类
1 [6 U* m2 I" } v1 G A% H3、模式分析
. N+ n1 M0 D' o3 S# {% O/ r6 z聚合是一个管理和组织数据对象的数据结构。) E2 w% i8 _6 @2 m7 a
聚合对象主要拥有两个职责:一是存储内部数据;二是遍历内部数据。
& M' G$ F- G0 p+ {) d$ }2 s+ o存储数据是聚合对象最基本的职责。! s* d# |$ g( z$ p% r
将遍历聚合对象中数据的行为提取出来,封装到一个迭代器中,通过专门的迭代器来遍历聚合对象的内部数据,这就是迭代器模式的本质。迭代器模式是“单一职责原则”的完美体现。2 c* S1 ]0 [ I: I8 p& l) v- _. a
9 ?5 V4 ^" f! r6 F' a' Z+ h
模式分析
, E/ f! E+ s6 A1 h# P自定义迭代器
# H4 W$ q. a& A! V1 w' pMyIterator——抽象迭代器
0 V7 F* w+ X oMyCollection——抽象聚合类7 ^+ I; \1 n1 m* q9 Z$ m1 O
NewCollection——具体聚合类4 k3 p. q9 S6 J: e+ |* X8 f
NewIterator——具体迭代器
7 l$ ^: E5 `8 c+ b$ P2 |/ ^Client
/ _3 n" y8 B8 }2 s- public class ConcreteIterator implements Iterator, M/ D0 `9 c- R8 N) }
- {
# P+ |) |5 V! F/ K. G R1 G; F - private ConcreteAggregate objects;7 {: O! w. ]5 G7 ~/ D
-
7 \5 Q! F: E& C; y: Y, ~: `2 l - public ConcreteIterator(ConcreteAggregate objects)0 d' Z, K6 i" N2 d8 v( x
- {6 f* u+ p7 H: p# q, g4 g
- this.objects=objects;
3 U- l; o3 [- q" S' q4 A4 b - }; @# ^" B( C# h" L$ J5 i( P" H5 u
- public void first()
5 Y1 h$ S- y6 |5 v9 M - { ...... }. S2 R7 P# r* J2 }7 B' C: ^
-
. h( J! w; x+ v; Z6 | D - public void next()
+ h* ^8 F: S# I C2 B& m - { ...... }6 e4 ~$ T" U! v3 h7 Y7 B3 W
- public boolean hasNext()' ? f* C% W0 R6 G( U% o3 `
- { ...... }# K5 T2 V+ Q+ i: e
-
+ r. {4 [( k* N; S- h5 P) k - public Object currentItem()- O2 N& N* @" S3 z2 ?
- { ...... }
3 b" o- J. o1 H* A1 u% O r8 G - }
]' x* E* f( H - public class ConcreteAggregate implements Aggregate
. k J7 h8 \" [& N+ R$ I8 }( L - { 1 y# q$ m) W* ]/ h
- ......
2 M' E4 @0 v* ]( q& M - public Iterator createIterator()
3 R% L+ ]6 ~: e, w7 @, J4 q$ T - {
2 c9 B8 K: E4 V- o$ m% N) x0 G - return new ConcreteIterator(this);
0 _- ^0 r8 t( H6 E$ s - }
+ e$ o i1 R5 H/ q4 S% }9 n! M* L- _9 v7 H$ M - ......, \% u. c( ]% h$ A, w
- }
3 o F% L- l* ~
复制代码 在迭代器模式中应用了工厂方法模式,聚合类充当工厂类,而迭代器充当产品类,由于定义了抽象层,系统的扩展性很好,在客户端可以针对抽象聚合类和抽象迭代器进行编程。2 @. Q( D5 h: m1 `
由于很多编程语言的类库都已经实现了迭代器模式,因此在实际使用中我们很少自定义迭代器,只需要直接使用Java、C#等语言中已定义好的迭代器即可,迭代器已经成为我们操作聚合对象的基本工具之一。4 u6 W, ?8 _3 \+ f8 F
. m% I2 [; Z* f5 T/ R" k' Y" ]- S( D4、模式优缺点; C6 Q4 }7 D4 E) u% \3 i
迭代器模式的优点
* X0 G5 T6 e) a/ l Y5 e它支持以不同的方式遍历一个聚合对象。
5 v5 ?) v4 j6 }迭代器简化了聚合类。8 z' B2 o4 j: Q
在同一个聚合上可以有多个遍历。
& m" m7 P+ P+ k. R0 O; ^' t在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码,满足“开闭原则”的要求。 迭代器模式的缺点
1 c/ P5 _/ P! P由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性。9 J* ^4 d% i) {5 Q) F2 j$ w
5、模式适用环境
/ n: S1 b. F x在以下情况下可以使用迭代器模式:9 u: I, u4 g. {1 ]& w
访问一个聚合对象的内容而无须暴露它的内部表示。% @8 Y# }; d& `4 h
需要为聚合对象提供多种遍历方式。
! h2 ^9 j' q! u# z: }# @2 y为遍历不同的聚合结构提供一个统一的接口。 $ p7 \+ `3 b8 z; u
$ B9 W& d) o0 B5 [
|