1、模式定义; d& L8 d& S1 E+ e
迭代器模式(Iterator Pattern) :提供一种方法来访问聚合对象,而不用暴露这个对象的内部表示,其别名为游标(Cursor)。迭代器模式是一种对象行为型模式。- R( i2 X* D5 W7 l3 V. Z# _
6 F/ f! {/ Z! [0 U1 \
2、模式结构" _' P3 [6 G5 q/ R1 [
迭代器模式包含如下角色:
! \2 @6 Z: r; B" g* C$ g# lIterator: 抽象迭代器
8 w6 w/ R% N3 q/ t: ^0 M. v5 yConcreteIterator: 具体迭代器4 X L- z0 Y" i% M) Y
Aggregate: 抽象聚合类$ n4 v& f# S4 w. |
ConcreteAggregate: 具体聚合类' i8 l7 e6 r4 r g* Q
3、模式分析! x3 S2 @! V* W$ R, s. W6 \4 ?- a
聚合是一个管理和组织数据对象的数据结构。
$ S* K" @1 `& r: C2 y聚合对象主要拥有两个职责:一是存储内部数据;二是遍历内部数据。 5 t: S( {- ` D: o2 y
存储数据是聚合对象最基本的职责。2 f0 w+ ?% f& V v9 O' m8 P! C. s
将遍历聚合对象中数据的行为提取出来,封装到一个迭代器中,通过专门的迭代器来遍历聚合对象的内部数据,这就是迭代器模式的本质。迭代器模式是“单一职责原则”的完美体现。
; Y5 y+ S3 F/ f9 P/ M! R3 M5 {4 H2 g" @: D
模式分析' v' ?. c0 ?2 \9 a
自定义迭代器
/ \% F" h6 ?% O" h9 q' @9 `MyIterator——抽象迭代器
% I$ f! I2 {& I$ i6 IMyCollection——抽象聚合类- \$ S2 G5 M& V" m% d3 t9 h. v1 I& B
NewCollection——具体聚合类8 `5 v* K; W5 E( u6 k/ C
NewIterator——具体迭代器- H$ G6 U0 A, B- x+ s* w! y0 O
Client2 ?# F% Y% u) M8 A' @7 k
- public class ConcreteIterator implements Iterator' u8 S# ~# s' q! G
- {
( S+ U( o4 J4 C5 h$ T- w I - private ConcreteAggregate objects;
4 x. K2 U+ V1 I6 [+ M7 u - 0 L: F# N7 T/ M
- public ConcreteIterator(ConcreteAggregate objects)
6 Q" J c- F, r2 Y5 @1 R: @7 c - {
' u8 K8 K7 \, ]* g$ i4 V - this.objects=objects;) v$ {; ]" w- f" {, Q
- }# j& ]. p% b* g* o
- public void first()
. W, v# R8 [7 U - { ...... } n; c' y" P. W$ A4 [0 E2 n) N: M
- ( z- O( D7 R. ~2 x' q/ t
- public void next()2 o$ s4 @/ a5 b4 {. s" Z
- { ...... }: N E! `9 `" x/ `6 Y$ X! S; i
- public boolean hasNext()* q5 O. i8 i- w- {- U0 c3 J
- { ...... }; s8 L& @% T9 J! P' [* h' c6 b
-
6 ?4 s9 z$ m) x- S( s* o) M9 B - public Object currentItem() ]! G5 j" G( X* O
- { ...... }
* G& j( v; \+ p& q2 E, M* Z - }* r( M, ~1 W! i+ J9 p% {5 z# X
- public class ConcreteAggregate implements Aggregate6 l1 C" p v" l; u) ~! B0 Q
- { ) s: `$ T! N \, e9 _9 q! q
- ...... & b- r l( t2 m$ k7 @# h9 }9 O
- public Iterator createIterator()6 v8 X, l% s* U+ C! V# G4 o
- {
6 u% ]. J% p( F2 G8 K2 }* B - return new ConcreteIterator(this);' e& T4 j: Y9 T4 \# m' T
- }+ J/ E3 e* X7 r
- ......
+ K% ^4 J; f/ m$ h6 l - }
$ \9 e- r* h; D c3 I h
复制代码 在迭代器模式中应用了工厂方法模式,聚合类充当工厂类,而迭代器充当产品类,由于定义了抽象层,系统的扩展性很好,在客户端可以针对抽象聚合类和抽象迭代器进行编程。7 E. f# {* v9 Y8 }
由于很多编程语言的类库都已经实现了迭代器模式,因此在实际使用中我们很少自定义迭代器,只需要直接使用Java、C#等语言中已定义好的迭代器即可,迭代器已经成为我们操作聚合对象的基本工具之一。
- t$ P8 [- O3 E( L3 r
! X1 |7 j! q% _5 N# w% k4、模式优缺点% U/ V4 m/ |! y, R" ~/ {" `9 K8 q
迭代器模式的优点
) p8 l8 Z: g) o( @8 S s它支持以不同的方式遍历一个聚合对象。1 J- X7 |. x q0 L
迭代器简化了聚合类。% V( \ h" U- f9 e
在同一个聚合上可以有多个遍历。" F" G* j' |) A m4 I
在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码,满足“开闭原则”的要求。 迭代器模式的缺点
4 R8 t/ ^9 ^! u, _" j/ m由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性。. ?$ B2 r6 G( i
5、模式适用环境
$ D: G' m* e, V. b在以下情况下可以使用迭代器模式:
+ N2 g# ?5 {2 V: M o. C访问一个聚合对象的内容而无须暴露它的内部表示。
$ ^- g& s1 @5 U9 l% M需要为聚合对象提供多种遍历方式。
5 ^6 o: j/ G0 Z; m" o为遍历不同的聚合结构提供一个统一的接口。
4 y# E& u1 y' L3 j- L2 A& N5 g2 m7 @' t5 I! C; ]* D+ {
|