目录
[显示]

1.摘要

Iterator是一种常用的设计模式,在几乎所有容器类的遍历时都使用了迭代器模式。迭代器的一般至少由first/next/isDone/currentItem组成,要注意使用迭代器遍历集合时如何保证对集合的插入和删除操作不会干扰遍历。

2. 针对问题

如果要遍历一个列表,可以为列表类型声明first/next/end等函数,并在其中封装具体的遍历逻辑。但是这么做有几个弊端:
1、如果需要以不同的实现方式遍历列表,那么可能需要声明多种遍历操作。
2、一个列表可能需要同时进行多个遍历。
解决的方法之一就是把遍历相关的操作提取到另一个类中,这就是Iterator模式。

3. 介绍

提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示。

4. 实现

Iterator模式的静态图如下:

图中:
Aggregate为被访问对象的基类,它声明一个获取Iterator的函数。
ConcreteAggregate返回的ConcreteIterator实例,在ConcreteIterator中实现具体的迭代操作。

Iterator模式的实现要注意以下几点:
1、Iterator可分为内部和外部两种,外部Iterator由客户控制每一步遍历,内部Iterator只需要提交一个待执行的操作,Iterator负责对每一个元素执行该操作。
2、遍历算法可以在Iterator中定义,也可以在集合类中定义,这时Iterator只需要保存当前遍历的状态,我们称这种迭代器为游标(cursor)。
3、一个健壮的迭代器需要保证插入和删除操作不会干扰遍历。可以向集合对象注册迭代器,当修改元素时,调整迭代器的内部状态或维护迭代器正确遍历需要的额外信息。
4、迭代器一般需要对集合的特权访问,可使用友元函数、内部类等方式定义迭代器基类,并向迭代器的派生类暴露访问集合内部的方法。
5、对于使用Composite的复合对象,内部迭代器比外部迭代器的实现要简单一些(使用递归)。
6、迭代器的最小接口包括first/next/isDone/currentItem组成。

5. 特点

1、Iterator模式支持以不同方式遍历一个集合。
2、在同一个集合上可以有多个Iterator同时遍历。

6. 相关文章

设计模式总结

7. 参考文章

  1. 《设计模式_可复用面向对象软件的基础》