1、模式定义$ U6 z5 O/ |7 a' b6 v; |0 S/ Y% S
迭代器模式(Iterator Pattern) :提供一种方法来访问聚合对象,而不用暴露这个对象的内部表示,其别名为游标(Cursor)。迭代器模式是一种对象行为型模式。0 s! \% o( z! V% h- w/ s# a
( t) B2 B- {9 o+ {6 R2、模式结构
& Y% P# A& S ]- Q迭代器模式包含如下角色:# d& |- q8 n/ z o
Iterator: 抽象迭代器
; _& L* F6 o) f/ O: Q2 H8 KConcreteIterator: 具体迭代器
, J" E5 C' K0 I% `# o8 k' MAggregate: 抽象聚合类
/ y9 _; O! a8 p( a5 h: LConcreteAggregate: 具体聚合类
7 z- r- @7 O2 i7 ~3、模式分析
# I9 t3 O( J9 q3 T% m聚合是一个管理和组织数据对象的数据结构。
9 c6 t$ q% W8 p' I$ t" U聚合对象主要拥有两个职责:一是存储内部数据;二是遍历内部数据。
3 N( ?+ F% E+ W$ z% t! c存储数据是聚合对象最基本的职责。- Q$ V& x) A, n5 T
将遍历聚合对象中数据的行为提取出来,封装到一个迭代器中,通过专门的迭代器来遍历聚合对象的内部数据,这就是迭代器模式的本质。迭代器模式是“单一职责原则”的完美体现。+ C; ~. m0 h( D! I* `" g; j
6 M4 m% N# N" U0 w1 B# J模式分析
8 H% m: C8 F6 d自定义迭代器
. q+ h, G6 [$ V! n4 C0 q% LMyIterator——抽象迭代器; u& j! l4 Z1 Z7 q
MyCollection——抽象聚合类4 d) H+ u; G( u% A$ j! X
NewCollection——具体聚合类
; M9 s7 Q4 b7 E& DNewIterator——具体迭代器( U; w) b3 l/ J) o/ B) J9 d+ b$ o
Client- A5 K1 A. `8 i
- public class ConcreteIterator implements Iterator: J& o. e9 s; g3 x
- {
9 L* B& A$ O: e8 j4 f - private ConcreteAggregate objects;" k2 a8 W2 e7 O+ p
-
- {/ Y; K* p, n. h8 b/ }5 f! }4 l - public ConcreteIterator(ConcreteAggregate objects)0 S1 f B' S; U0 P% T8 g }
- {/ i O/ p/ h) r% Q- R- B
- this.objects=objects;
: e% o4 q" |% [) [4 L+ F - }8 s, G) s$ Z( y( Q. G, x
- public void first()4 _: ^/ A i( g2 e* T" D4 T
- { ...... }% {, ^# L3 P: n' }8 v8 L
-
* D; \3 E) ?3 F5 X6 u6 f* e9 k; z - public void next()# o# V, N' i$ N
- { ...... }
% i5 G# V* T/ O4 X1 C S - public boolean hasNext()
3 ?5 f5 A3 f. s7 d; N+ c) r" F - { ...... }
- V4 [. L: j, i; h8 L$ Z - ' ?. `! X% B! k* D
- public Object currentItem()" O$ \4 q) A2 r" D
- { ...... }& N* }' Z0 w" i
- }: _6 g* |9 s- |( D0 L6 O( N- n
- public class ConcreteAggregate implements Aggregate n, a d( H0 `3 ~
- { ' M* ^! R5 M, l% j
- ...... ) Z( w8 q V R# Y
- public Iterator createIterator()
4 p& ?9 G1 r+ n' Y8 A- s' L7 E' M - {# h/ M9 r8 T$ N2 i5 j6 ~
- return new ConcreteIterator(this);
: s; O5 V. P$ k& o+ | - }
) X) s& @8 W$ P5 H/ ? r - ......
4 M. H+ V. \: n! L' p9 G - } e. a$ T( A9 Z; `& Q6 V
复制代码 在迭代器模式中应用了工厂方法模式,聚合类充当工厂类,而迭代器充当产品类,由于定义了抽象层,系统的扩展性很好,在客户端可以针对抽象聚合类和抽象迭代器进行编程。+ i7 Z: A7 A6 |/ b
由于很多编程语言的类库都已经实现了迭代器模式,因此在实际使用中我们很少自定义迭代器,只需要直接使用Java、C#等语言中已定义好的迭代器即可,迭代器已经成为我们操作聚合对象的基本工具之一。
! V* h! W# x, n5 R5 Z5 z. {# d) ~
4、模式优缺点
& z7 O* `; D" o. t1 Z迭代器模式的优点% N* u& s( N9 b+ G/ J: d
它支持以不同的方式遍历一个聚合对象。
# `& A6 x1 v* S4 |# J" ^迭代器简化了聚合类。9 i+ o1 B+ c: J5 l
在同一个聚合上可以有多个遍历。
1 f. ?& c3 A$ I在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码,满足“开闭原则”的要求。 迭代器模式的缺点
3 M; z6 P! D( S' S$ G) @由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性。' a7 b/ Y! L! A6 e) ? `/ l
5、模式适用环境8 T; A1 }9 G! y
在以下情况下可以使用迭代器模式:
$ `2 Z+ C* V# q0 O4 B% u% o访问一个聚合对象的内容而无须暴露它的内部表示。. V2 S$ y; _$ U. T" W. a
需要为聚合对象提供多种遍历方式。5 e6 f- l7 x, ^! `9 g" O W3 y
为遍历不同的聚合结构提供一个统一的接口。 0 Z( u! r. K& W- o; t: v9 E. A
# }5 g2 i1 O9 K" M6 @) V2 M7 x |