1、模式定义! W) M! k! `2 P& H
迭代器模式(Iterator Pattern) :提供一种方法来访问聚合对象,而不用暴露这个对象的内部表示,其别名为游标(Cursor)。迭代器模式是一种对象行为型模式。! e- E$ A4 L+ g n( O5 C4 F6 m
* C, e7 Y( x+ @& ^# v2、模式结构
5 [6 B$ w9 h$ x- `( f迭代器模式包含如下角色:( v' z# A* t: E3 I; c
Iterator: 抽象迭代器& i2 x5 l: g' ^
ConcreteIterator: 具体迭代器/ m8 H/ Q* h3 I% `2 @
Aggregate: 抽象聚合类& d/ {9 T5 c* f7 g* d
ConcreteAggregate: 具体聚合类* v V' G- r# b; H R
3、模式分析9 x2 f* b) Z, J( C9 N6 Q, b. w
聚合是一个管理和组织数据对象的数据结构。
0 {9 v* V( W" l# U/ f- y聚合对象主要拥有两个职责:一是存储内部数据;二是遍历内部数据。
8 b. g- Y: y7 d: R$ T存储数据是聚合对象最基本的职责。
) b8 F. p3 V A4 A6 o7 J将遍历聚合对象中数据的行为提取出来,封装到一个迭代器中,通过专门的迭代器来遍历聚合对象的内部数据,这就是迭代器模式的本质。迭代器模式是“单一职责原则”的完美体现。- U' l T! W: r/ [
& D; q1 @; x% f, D! d/ w/ e
模式分析
5 l: @. ?1 n& b/ P/ H自定义迭代器/ h. a* C9 i' E) v' M6 I4 W, F
MyIterator——抽象迭代器( N; }$ ?( ?7 f) t# W
MyCollection——抽象聚合类# r6 A) H+ N! Y! C8 L! q: v; k
NewCollection——具体聚合类# W" u* ^1 e w2 d3 [
NewIterator——具体迭代器/ I* l; J1 t7 S
Client% S8 e; o. D7 ?. |0 X. Q5 F
- public class ConcreteIterator implements Iterator
+ K: k. u) ]) Y* {" \$ i - {
' Y2 [" f2 o6 Y- }( O; D0 n - private ConcreteAggregate objects;
$ c4 l4 s& a, `* G C - # w" C! |" A0 O3 o r- e$ w
- public ConcreteIterator(ConcreteAggregate objects); R; G. t* R. e- U" f& e5 m2 J+ i
- {
8 G' ^* k9 M% \ - this.objects=objects;' U% ~5 G3 o6 |& `# }; }
- }
7 K9 v+ Y' C A2 m8 i9 h - public void first(); _, P j* b6 e8 N& I
- { ...... }
: j8 \2 H4 r( g/ r - & S$ L9 r( l' d, m4 h4 V$ ~
- public void next(). O1 R; Q L' ]) w5 G1 [
- { ...... }
- F1 R4 x7 k& N( F - public boolean hasNext()0 B8 i9 ~) s- @
- { ...... }
+ Q6 y, x# C7 z/ g8 w9 H* `: l0 O -
% u/ O* m5 E: X - public Object currentItem()1 e0 Z8 D% |6 W2 I# R
- { ...... }
7 h% D8 o- ~% V1 k4 Z, }4 a/ W0 P - }) Z9 ^3 h4 F2 P) s% [: @
- public class ConcreteAggregate implements Aggregate! P; [" N5 v! t; ?! u
- {
9 M- N. i2 W7 X - ......
* y5 [: k( J" j. z! D. Z - public Iterator createIterator()
- }) Y' a; L) j0 h0 G$ D5 L - {
5 W% m- x3 s- c, P6 A - return new ConcreteIterator(this);
0 v& g3 e0 N4 b# T, W8 L& k6 I7 _1 J - }
* j7 i+ Z( x8 E- N. |% P - ......$ `2 d6 I }5 I4 _$ a" }- k
- }
H3 w- L$ V6 j6 ?7 r
复制代码 在迭代器模式中应用了工厂方法模式,聚合类充当工厂类,而迭代器充当产品类,由于定义了抽象层,系统的扩展性很好,在客户端可以针对抽象聚合类和抽象迭代器进行编程。
9 E# |; O( N7 k2 j由于很多编程语言的类库都已经实现了迭代器模式,因此在实际使用中我们很少自定义迭代器,只需要直接使用Java、C#等语言中已定义好的迭代器即可,迭代器已经成为我们操作聚合对象的基本工具之一。
$ r* C# f/ F0 {2 K
8 r1 U5 [% k* W8 I6 r. E4、模式优缺点
+ U2 E+ q% e) |* X7 G) d, B迭代器模式的优点
( x/ A# Z! M5 I6 e它支持以不同的方式遍历一个聚合对象。 H: t: F5 I* J' ?2 M1 l6 E) ^1 B
迭代器简化了聚合类。+ J. H2 Y! O# x2 h0 n4 N
在同一个聚合上可以有多个遍历。3 H5 t) o. d' z
在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码,满足“开闭原则”的要求。 迭代器模式的缺点
: f2 C! e" a4 V, B由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性。/ w h T3 p" W" m: \
5、模式适用环境
( W+ u+ Y: H$ `) A. E* x# P k1 l在以下情况下可以使用迭代器模式:# `$ X* Y" z7 u: D
访问一个聚合对象的内容而无须暴露它的内部表示。2 V |2 V' p# a
需要为聚合对象提供多种遍历方式。& C" E- `# X4 \- G; i
为遍历不同的聚合结构提供一个统一的接口。 8 }' y% j7 f, V ?6 f2 E9 o
1 w9 a8 A9 V2 V: R' ` |