1、又叫游标(Cursor)模式,是对象的行为模式
- 迭代子模式可以顺序地访问一个聚集中的元素而不必暴露聚集的内部表象
- 聚集依赖于聚集结构的抽象化,具有复杂化和多样性
- 数组就是最基本的聚集,也是其他的JAVA聚集对象的设计基础
- JAVA聚集对象是实现了共同的java.util.Collection接口的对象,是JAVA语言对聚集概念的直接支持
- JAVA语言提供了很多种聚集,包括Vector、ArrayList、HashSet、HashMap、Hashtable等,这些都是JAVA聚集的例子
2、迭代子模式的结构
- 白箱聚集与外禀迭代子
- 黑箱聚集于内禀迭代子
白箱聚集与外禀迭代子
- 如果一个聚集的接口提供了可以用来修改聚集元素的方法,这个接口就是所谓的宽接口
- 这样会破坏对聚集对象的封装。这种提供宽接口的聚集叫做白箱聚集
- 由于聚集自己实现迭代逻辑,并向外部提供适当的接口,使得迭代子可以从外部控制聚集元素的迭代过程
- 这样一来迭代子所控制的仅仅是一个游标而已,这种迭代子叫做游标迭代子(Cursor Iterator)
- 由于迭代子是在聚集结构之外的,因此这样的迭代子又叫做外禀迭代子(Extrinsic Iterator)
- 客户端代码
黑箱聚集与内禀迭代子
- 如果一个聚集的接口没有提供修改聚集元素的方法,这样的接口就是所谓的窄接口
- 客户端代码
主动迭代子和被动迭代子
- 所谓主动(外部)迭代子,指的是由客户端来控制迭代下一个元素的步骤,客户端会明显调用迭代子的next()等迭代方法
- 所谓被动(内部)迭代子,指的是由迭代子自己来控制迭代下一个元素的步骤
- 总体来说外部迭代器比内部迭代器要灵活一些,因此我们常见的实现多属于主动迭代子
静态迭代子和动态迭代子
- 静态迭代子由聚集对象创建,并持有聚集对象的一份快照(snapshot),在产生后这个快照的内容就不再变化
- 动态迭代子则与静态迭代子完全相反,在迭代子被产生之后,迭代子保持着对聚集元素的引用
3、完整的动态迭代子不容易实现,但是简化的动态迭代子并不难实现
Fail Fast
- JAVA语言以接口java.util.Iterator的方式支持迭代子模式
- Collection接口要求提供iterator()方法,此方法在调用时返还一个Iterator类型的对象
- 作为Collection接口的子类型,AbstractList类的内部成员类Itr便是实现Iterator接口的类
迭代子模式的优点
- 迭代子模式简化了聚集的接口。迭代子具备了一个遍历接口,这样聚集的接口就不必具备遍历接口
- 每一个聚集对象都可以有一个或多个迭代子对象,每一个迭代子的迭代状态可以是彼此独立的
- 由于遍历算法被封装在迭代子角色里面,因此迭代的算法可以独立于聚集角色变化