1、模式定义
7 k$ t% p: Z {4 F# s4 b. O迭代器模式(Iterator Pattern) :提供一种方法来访问聚合对象,而不用暴露这个对象的内部表示,其别名为游标(Cursor)。迭代器模式是一种对象行为型模式。8 d: T) x I& ~
+ A- N" B! q! d6 @5 E4 \# \) ~2、模式结构
_$ k( E9 w6 H3 R; n' e迭代器模式包含如下角色:
/ n- w8 _' Y2 ?+ d- p, m( i* f, K7 fIterator: 抽象迭代器
2 k6 V8 p$ @2 R: m4 m& [ConcreteIterator: 具体迭代器
' @8 U) I) Z- K" FAggregate: 抽象聚合类
; F, i- G. W* _ w0 m# K n UConcreteAggregate: 具体聚合类
# ]5 W' r! C8 x- A; y$ X3、模式分析& P' \) o; h! {, i v
聚合是一个管理和组织数据对象的数据结构。, }/ f+ U' L( G7 Y$ I- n
聚合对象主要拥有两个职责:一是存储内部数据;二是遍历内部数据。
* g$ b4 Q0 f0 l: b. Q3 a3 v3 w存储数据是聚合对象最基本的职责。
! ^, _* [7 [8 t3 D9 M将遍历聚合对象中数据的行为提取出来,封装到一个迭代器中,通过专门的迭代器来遍历聚合对象的内部数据,这就是迭代器模式的本质。迭代器模式是“单一职责原则”的完美体现。
* {2 Z" J% w% p: O
: g" S: W: a; o6 ]; q' _6 R模式分析/ Z% ^9 t$ l% v" m9 Y2 S& E
自定义迭代器" \& q0 d0 }2 u7 a7 N" Z
MyIterator——抽象迭代器! u. N9 ~ F4 d8 a, {9 M" G
MyCollection——抽象聚合类
/ D: f V2 x* I4 |5 D% m' s. M9 oNewCollection——具体聚合类0 z4 E7 Y! B$ v2 |
NewIterator——具体迭代器
5 w+ `& o5 i; H+ D# eClient' m- b* D" V4 o* ^( W% M7 h- A9 v
- public class ConcreteIterator implements Iterator
/ S( O3 Z" L9 Z9 [ ]$ B5 |6 Z' L - {3 O6 A. _# Z# ^7 ]) k4 c
- private ConcreteAggregate objects;( H, n& o- ~2 m P3 e
- ) h" X0 h9 T& [' Z2 B: w
- public ConcreteIterator(ConcreteAggregate objects): R- T. |9 j7 @
- {8 E% d& A5 k# V( \4 X
- this.objects=objects;
' Q r f. m* ] - }
: i1 Q$ G# ?4 I) |# w5 m - public void first()
7 W' v. n {3 D! t, K( V - { ...... }
5 k/ o/ Y$ `. d; t3 X% [( f$ ? - 1 u7 q! G2 T% p+ N
- public void next()
; l1 j$ y/ [& I% U* T4 A - { ...... }
* z, G! T; F4 O# K! f' H( t4 P - public boolean hasNext()
! ?& @8 i k Y. i - { ...... }
2 d; ~( U& Q# F9 ^* ^( O L - 5 s2 l1 j, Q$ c) D$ z
- public Object currentItem()2 }; R7 R8 k" i8 A
- { ...... }( Q$ I- G8 d4 b W2 d0 H' c' E# O* r
- }& w7 I% P1 J% p9 ]
- public class ConcreteAggregate implements Aggregate) s" d# B2 h& v/ _# X
- { ' K% A1 t5 o+ F' ?
- ......
i4 w: D3 A! E$ n( E n - public Iterator createIterator()$ B+ B M$ d1 o/ M6 Z
- {
# `& _$ A' _- S* `5 K0 @7 O - return new ConcreteIterator(this);# U/ e3 u' E* X n' R
- }
/ b5 \2 A' i: g: r* A5 |$ v S7 i0 V - ......
# A x- i5 ]9 ~$ v# p - }
/ ?4 X* ^$ E. F# H7 h
复制代码 在迭代器模式中应用了工厂方法模式,聚合类充当工厂类,而迭代器充当产品类,由于定义了抽象层,系统的扩展性很好,在客户端可以针对抽象聚合类和抽象迭代器进行编程。
$ e V- g+ M6 j% A8 ^由于很多编程语言的类库都已经实现了迭代器模式,因此在实际使用中我们很少自定义迭代器,只需要直接使用Java、C#等语言中已定义好的迭代器即可,迭代器已经成为我们操作聚合对象的基本工具之一。: W& o( V' R; U6 i; t
5 C, ]- i; T7 c) G; M+ [$ d6 ]4、模式优缺点( P- a' r8 Z+ z! K: M3 Z! S$ V/ G
迭代器模式的优点
6 X' j6 D3 U& B' a" |5 P- F它支持以不同的方式遍历一个聚合对象。
6 \7 d* [0 d- M迭代器简化了聚合类。
2 N- C' z2 G) ~1 P, y在同一个聚合上可以有多个遍历。
& \' c, \6 U: V# Z2 X# V在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码,满足“开闭原则”的要求。 迭代器模式的缺点
7 [3 v M" d/ M0 X由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性。
% X0 A; Y) O8 e% s; v 5、模式适用环境
0 ]3 y0 M4 A+ B在以下情况下可以使用迭代器模式:3 c/ k$ s7 d3 X n/ ~
访问一个聚合对象的内容而无须暴露它的内部表示。
* F6 w" B: {8 O4 Y需要为聚合对象提供多种遍历方式。
, W; t( B. C8 ?2 X为遍历不同的聚合结构提供一个统一的接口。
" [% L3 B! y) x) v" ^# A1 |- b2 |0 ~
|