基础概念
- 迭代器模式:提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示。
- 适用性:
- 访问一个聚合对象的内容而无需暴露它的内部表示。
- 支持对聚合对象的多种遍历。
- 为遍历不同的聚合结构提供一个统一的接口(即,支持多态迭代)。
- 参与者: -
Iterator
- 迭代器定义访问和遍历元素的接口。 -ConcreteIterator
- 具体迭代器实现迭代器的接口。 - 对该聚合遍历时跟踪当前位置。 -Aggregate
- 聚合定义创建相应迭代器对象的接口。 -ConcreteAggregate
- 具体聚合实现创建相应迭代器的接口,该操作返回ConcreteAggregate
的一个适当的实例。
注意事项
- 谁控制该迭代:一个基本的问题是决定由哪一方来控制该迭代,是迭代器还是使用该迭代器的客户。当由客户来控制迭代时,该迭代器称为一个外部迭代器,而当由迭代器控制迭代时,该迭代器称为一个内部迭代器。使用外部迭代器的客户必须主动推进遍历的步伐,显示地向迭代器请求下一个元素。相反地,若使用内部迭代器,客户只需向其提交一个待执行的操作,而迭代器对聚合中的每一个元素实施该操作。
- 谁定义遍历算法:迭代器不是唯一可定义遍历算法的地方。聚合本身也可以定义遍历算法,并在遍历过程中用迭代器来存储当前迭代的状态。我们称这种迭代器为一个游标,因为它仅用来指示当前位置。
- 迭代器健壮程度如何:在遍历一个聚合的同时更改这个聚合可能是危险的。如果在遍历聚合的时候增加或删除该聚合元素,可能会导致两次访问同一个元素或者遗漏掉某个元素。