意图:提供一种顺序访问一个聚合对象中各个元素,而不需要暴露聚合对象内部行为。即将列表的访问和遍历从列表对象中分离出来,放入迭代器对象中。使遍历和列表对象接口。可产生一个列表对象可以复用多个迭代器(多种遍历方式),一个迭代器支持多个列表对象(多个列表对象由相同遍历算法,或者列表对象本身提供算法差异部分)的编程效果效果。
类图:(来自《设计模式:可复用面向对象软件的基础》)
Aggregate(聚合对象接口):聚合对象接口,定义了创建相应迭代器(Iterator)的接口。
Iterator(迭代器接口):迭代器的接口,定义顺序访问遍历聚合对象内容的相关方法。遍历方式可以是正序、倒叙(针对集合)、前序、后序、中序以及广度遍历(针对数集合或者复合对象)。方法可以根据实际情况相应扩展或者减少。
ConcreteAggregate(聚合对象实现类):聚合对象实现类,保存遍历的聚合数据。实现聚合对象接口。负责创建返回迭代器(iterator)的具体实现类(ConcreteIterator)。
ConcreteIterator(迭代器实现类):实现迭代器接口,提供实际的遍历方法(遍历算法可以自己通过,也聚合实现类(ConcreteAggregate)提供)。
Client(使用者):迭代器遍历使用者,持有聚合对象接口(Aggregate)和迭代器接口(Iterator)。不持有迭代器实现类(ConcreteIterator),可能持有聚合对象实现类(ConcreteAggregate)(具体看ConcreteAggregate产生方式,若非直接new,也不持有)。
优点(来自《设计模式:可复用面向对象软件的基础》):
设计模式相关说明:
空迭代器:是一个退化的迭代器,IsDone()始终返回true。
外部迭代器:由使用者来控制迭代的迭代器。相对于内部迭代器更加灵活,但是比较复杂。
内部迭代器:由迭代器自己控制迭代。相应外部比较容易。