1、模式定义( q# e* o' F ^$ H( E% x5 I
迭代器模式(Iterator Pattern) :提供一种方法来访问聚合对象,而不用暴露这个对象的内部表示,其别名为游标(Cursor)。迭代器模式是一种对象行为型模式。! l" F$ J4 }) x1 Y" k! B: B2 c/ x. [
I4 \0 A) m) V$ f% j6 A! a2、模式结构# I" x0 w* R- e: }: O- N/ o& o
迭代器模式包含如下角色:
+ @. E/ Y' h2 k* B8 J$ OIterator: 抽象迭代器
0 i9 Q( g% l' U: i0 @3 wConcreteIterator: 具体迭代器4 `% X* e8 p; u( Q- d- Z% F# \
Aggregate: 抽象聚合类
, w# W' k: ~2 \2 F& f( W/ Z6 @ConcreteAggregate: 具体聚合类
& Q3 ?- Z- } r- L/ v& s3、模式分析# u/ f% ?1 @" \! ]( a9 @2 U2 J% [5 Q; c- U
聚合是一个管理和组织数据对象的数据结构。) ^- Z% T0 x( n& b8 y! ^
聚合对象主要拥有两个职责:一是存储内部数据;二是遍历内部数据。
- h# x! f6 Q" X1 g存储数据是聚合对象最基本的职责。
) v1 X/ R( N( ~将遍历聚合对象中数据的行为提取出来,封装到一个迭代器中,通过专门的迭代器来遍历聚合对象的内部数据,这就是迭代器模式的本质。迭代器模式是“单一职责原则”的完美体现。
* [- W2 K' t# c8 e$ f! O9 o& H5 I2 N! o/ m% ]
模式分析+ D2 f- i. o* W. S+ _9 i8 Z2 C
自定义迭代器
; {. t& O7 r$ w$ x% ~MyIterator——抽象迭代器' X, @5 K) I5 N" t2 w
MyCollection——抽象聚合类
, {4 o, R* i1 y7 H/ lNewCollection——具体聚合类
. k3 D w2 I& [( FNewIterator——具体迭代器
2 O5 h! W8 l+ N- @Client! l2 L1 D7 [; J' g& Q
- public class ConcreteIterator implements Iterator3 T9 A! T: u* n2 O& i5 U" y
- {
: G% e0 S( b2 L% P - private ConcreteAggregate objects;0 ?7 \' S o6 e# K' Q1 z- U; V
-
: ^# a. s! r( [* {( H - public ConcreteIterator(ConcreteAggregate objects)
* G) }( j& U( c/ y( s% q - {
/ e/ Z R5 X' c/ } _" k - this.objects=objects;6 V1 ^# M' D& K' `4 X
- }
4 @' L* m2 I% W X; Y2 A. f - public void first()
! J9 ]; i0 O/ t g1 _% b - { ...... }; ?# |5 u8 Z1 s, N, s7 ]; T; D4 d3 ?
- : |+ U# ?" k4 `: ~/ p- g# ~
- public void next()
% N/ R p% f& w# b; C% ~, G2 o - { ...... }
! B0 d8 O4 F* V8 @5 B3 u - public boolean hasNext()
+ B& _/ m2 q7 o% v0 F+ V - { ...... }9 k. Q% j; t3 F1 ^ m
-
+ d# l. w' r$ w" ?# u - public Object currentItem()
6 z8 q, A% V3 u6 K - { ...... }1 l% }+ L. T4 ^& Z
- }
& ^2 R( s: Q$ Q" F, ~7 g$ H2 R, P - public class ConcreteAggregate implements Aggregate
2 q# k9 t0 ^3 F) Q- L - {
% {* W/ f9 v% [: F7 U" Y" q5 s - ......
& l ` v/ q7 u( u' f - public Iterator createIterator()$ G. a$ Q/ q& z: R, \( t1 P
- {9 j( g5 f( ]( o3 T- J
- return new ConcreteIterator(this);" v n+ p7 J1 e# Y6 L$ V% ?
- }6 C* {# j# i. x# T
- ......" B' M* `( w6 Q4 }# q! D
- }% {" V9 ]- V8 @1 X- x
复制代码 在迭代器模式中应用了工厂方法模式,聚合类充当工厂类,而迭代器充当产品类,由于定义了抽象层,系统的扩展性很好,在客户端可以针对抽象聚合类和抽象迭代器进行编程。5 t( X: P; k- `5 ^7 m& r* |/ Q
由于很多编程语言的类库都已经实现了迭代器模式,因此在实际使用中我们很少自定义迭代器,只需要直接使用Java、C#等语言中已定义好的迭代器即可,迭代器已经成为我们操作聚合对象的基本工具之一。
0 ]1 i0 V. x! F! R) h; b! s) Y' X. b- _- L9 ?8 G: M/ C, ^/ Y( {
4、模式优缺点
) }- O6 _5 z5 m迭代器模式的优点
6 g- x$ e& j9 \0 X) N7 j8 y它支持以不同的方式遍历一个聚合对象。0 Y9 Y( A8 e( L- E% h" y9 D0 M+ T
迭代器简化了聚合类。/ H, a; I, w1 ?% R/ @3 s
在同一个聚合上可以有多个遍历。! r. k+ ^! N0 m3 W' k* P7 N- e0 W
在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码,满足“开闭原则”的要求。 迭代器模式的缺点) y; e0 {. R0 g
由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性。9 |, a# B0 Y0 Y; Z' k
5、模式适用环境
; c$ }( W |' N+ n在以下情况下可以使用迭代器模式:
' R( L0 Y, I7 V9 A ~访问一个聚合对象的内容而无须暴露它的内部表示。
, s9 a- X( o7 O" G需要为聚合对象提供多种遍历方式。
; Y4 n" A% G) C$ |- v为遍历不同的聚合结构提供一个统一的接口。 7 ~% r! H* I6 `4 x7 v+ y3 @
, s. _. I3 Q6 h# e' T# } |