对象的行为模式。又称之为游标模式。
什么是迭代子模式?
迭代子模式可以顺序地访问一个集合中的元素而不必暴露集合的内部表象。
即 迭代子模式将迭代逻辑封装到一个独立的迭代子对象中,从而与聚集本身分割开。(更符合开闭原则)
相关角色
抽象迭代子角色 定义遍历元素所需的接口
具体迭代子角色 实现了Iterator接口,记录迭代过程中的游标位置
抽象集合角色 给出创建迭代子对象的接口
具体集合角色 实现创建迭代子对象的接口,返回一个适合的具体迭代子对象
客户端角色 持有集合、迭代子对象,调用迭代子对象的迭代接口,可以通过迭代子对象操作集合元素的增加和删除。
为何需要迭代子模式?
如题:一个集合已经向外界提供了遍历的方法,客户端可以自行迭代了,为何需要创建一个迭代子对象进行迭代呢?
原因是: 迭代子对象和迭代模式会将迭代过程抽象化,当集合发生变化,迭代子可以作为一个中间层吸收变化的因素。(屏蔽变化)
迭代子模式统一了所有的集合对象的迭代遍历接口,可以使得系统使用一个统一的方式对多个不同的集合对象进行迭代。(当集合可能变化时,我们的迭代过程则不需要变化)。
例如:ArrayList变化为LinkedList,即使数据结构改变,但因为有迭代器的存在,使得迭代逻辑可以不变。
(一个底层为数组,一个底层为链表,若使用普通遍历方式,差异很大!)
注意:在迭代过程中,一旦集合元素发生变化,例如:增加一个元素或删除一个元素,都会影响到迭代过程,使得迭代无法给出正确的结果。
Fail Fast机制
当一个算法开始后,如果它的环境发生变化,使得算法无法进行必须的调整,这个算法就应该发出故障信号。
应用到迭代子模式中就是:
当迭代子所遍历的集合对象被外部修改,就会造成迭代过程的崩溃,所以Fail Fast是一种出现错误的早期报警功能。
优点和缺点
优点
- 简化了集合,迭代子有遍历接口,集合就不需要了
- 每一个集合都可以有多个迭代子对象,彼此独立
- 将遍历算法封装在迭代子角色中,在获取到迭代子对象后,不必知道集合对象的类型,就可以完成遍历
缺点
- 给人一种集合被顺序化的错觉
- 迭代子给出的元素都是Object,么有类型特征。
Iterator与ListIterator接口
ListIterator是Iterator的扩展接口,除了Iterator接口提供的正向迭代功能外,还提供了 逆向迭代、安全的插入、更新、删除集合元素的方法
它们都实现了Fail Fast功能!
Iterator与Iterable接口
1、Iterable有一个创建迭代器的方法,每次都是创建新的迭代器对象,互不干扰
2、集合实现Iterable而不是iterator的原因是 如果直接实现Iterator接口,那么每个集合对象同时也是迭代器对象,集合中必然存储迭代指针,当集合在多个方法间传递时,它的迭代位置是不可预知的(即 多次迭代互为干扰)