1、模式定义
) Y" A9 _/ U9 V$ E' S/ r! E迭代器模式(Iterator Pattern) :提供一种方法来访问聚合对象,而不用暴露这个对象的内部表示,其别名为游标(Cursor)。迭代器模式是一种对象行为型模式。
! Y' e, o, k& W
% S8 Q* P$ h8 ~! U2 E0 }) L9 G( A2、模式结构
+ B4 b+ s$ l" S; r# w迭代器模式包含如下角色: m) ^' R2 k8 i' `- E; |! h
Iterator: 抽象迭代器1 K* u2 R( y9 L5 \
ConcreteIterator: 具体迭代器
9 x" ^" H& o- B* Z6 o! n/ z9 mAggregate: 抽象聚合类
, J% [/ J0 l: H* v! k- X) V% H0 IConcreteAggregate: 具体聚合类" b( L1 v' n( Q: T; K
3、模式分析
; Y! U: t [0 S; \: }, W聚合是一个管理和组织数据对象的数据结构。# q$ f* l+ u( `$ g& q7 r
聚合对象主要拥有两个职责:一是存储内部数据;二是遍历内部数据。
) t6 g9 f# v' t# U存储数据是聚合对象最基本的职责。* h5 f9 K* ]- X
将遍历聚合对象中数据的行为提取出来,封装到一个迭代器中,通过专门的迭代器来遍历聚合对象的内部数据,这就是迭代器模式的本质。迭代器模式是“单一职责原则”的完美体现。
/ M# A. r- y) u& G
. Y- a8 G# f7 ?* _' q) e模式分析: U! g: \2 m) `0 q& d) K% f
自定义迭代器
: z4 l4 h/ s1 P! t! s) EMyIterator——抽象迭代器: V6 ]& s' \3 ~8 e" l; c* H" k' {
MyCollection——抽象聚合类
0 g0 x8 h$ o9 @; pNewCollection——具体聚合类
" u2 R5 g8 v; ?$ e" qNewIterator——具体迭代器; W Y- Y# B6 Y7 ~5 q8 c
Client# c* n+ i: o; ~0 h
- public class ConcreteIterator implements Iterator
4 t, k( ~+ u# e; }/ e - {9 A' _, D. l2 L2 a( t
- private ConcreteAggregate objects;
5 L: O) P* Y0 U. J9 @# X! B -
& l. Y' t1 }1 f - public ConcreteIterator(ConcreteAggregate objects)
; X' O; \ L3 @- z& j. k - {
4 O* I. h/ z" w- r* _4 O - this.objects=objects;1 ^5 I, W* W: i# {
- }
* c& V! a* x; Q; G - public void first()' [' t, z4 T3 m6 C- j
- { ...... }
) i+ X& [1 Q$ F. r0 } M -
" H& s+ n/ W# B - public void next()0 l' z* u9 p! A7 t
- { ...... }4 C, @0 \- Y* |
- public boolean hasNext()) _9 H1 K2 V! j$ n7 v# k. F" H) j Y
- { ...... }" m- G4 y; D" m( d
-
9 E) N1 k- p# E$ K% q' ?1 ` - public Object currentItem()
8 v! T! t5 F2 Q) f6 I- w7 O; q - { ...... }( J" f; q1 {9 |9 S5 |; P$ Z% S
- }' }! v% a4 a0 p7 p6 ?7 h4 U
- public class ConcreteAggregate implements Aggregate
3 D( L2 y8 t3 K b( G - { 8 d n, R+ A8 ^- n( Y# ]" q
- ...... 6 f3 R& s9 z% b
- public Iterator createIterator()2 @# w: O% Z" L" h" K
- {" l4 N) N s6 Z3 ]
- return new ConcreteIterator(this);
. R: m3 w9 M2 u5 A - }4 P8 B5 _# I! l8 w% _
- ......! z, m/ i, ~+ y. A
- }
' l: w: t5 w- @5 W) ?
复制代码 在迭代器模式中应用了工厂方法模式,聚合类充当工厂类,而迭代器充当产品类,由于定义了抽象层,系统的扩展性很好,在客户端可以针对抽象聚合类和抽象迭代器进行编程。
$ @) i& K3 w! O* m& y% k1 H2 V% U由于很多编程语言的类库都已经实现了迭代器模式,因此在实际使用中我们很少自定义迭代器,只需要直接使用Java、C#等语言中已定义好的迭代器即可,迭代器已经成为我们操作聚合对象的基本工具之一。
" R' v+ Z+ r* J6 q% Y+ `
?- \! J. p$ }$ B5 L4、模式优缺点) C/ C0 h' \% b+ d
迭代器模式的优点. v; A7 W4 m+ A D% V& t3 _
它支持以不同的方式遍历一个聚合对象。2 H; A5 t. Y; F% C; y- \
迭代器简化了聚合类。
( b) g! X* L1 b8 n- g: `1 g在同一个聚合上可以有多个遍历。
4 M5 K N) p7 Y在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码,满足“开闭原则”的要求。 迭代器模式的缺点
: v: [2 h/ r% p- A由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性。
; {8 K6 x( M9 z( ^) a1 s 5、模式适用环境
/ e" A9 `& v5 T8 H e在以下情况下可以使用迭代器模式:" L8 a1 D H2 i. n- C
访问一个聚合对象的内容而无须暴露它的内部表示。
5 d7 l8 ~1 z, t* V( W; n5 c7 a4 _需要为聚合对象提供多种遍历方式。# x# P1 D0 P0 `+ K
为遍历不同的聚合结构提供一个统一的接口。 5 t p* n" o) s* d, r( a' Z4 d$ R3 {
6 g n6 F" i. j% `$ p |