Iterator(迭代器)---对象行为型模式

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

将对列表的访问和遍历从列表对象中分离出来并放入一个迭代器对象中。迭代器类定义了一个访问该列表元素的接口。迭代器对象负责跟踪当前的元素。

将遍历机制与列表对象分离使我们可以定义不同的迭代器来实现不同的遍历策略,而无需在列表接口中列举它们。

迭代器模式可用来:

1、访问一个聚合对象的内容而无需暴露它的内部表示。

2、支持对聚合对象的多种遍历。

3、为遍历不同的聚合结构提供一统一的接口。

迭代器模式有三个重要的作用:

1、它支持以不同的方式遍历一个集合。复杂的聚合可用多种方式进行遍历。迭代器模式使得改变遍历算法变得很容易,仅需要用一个不同的迭代器的实例代替原先的实例即可。

2、迭代器简化了聚合的接口。有了迭代器的遍历接口,聚合本身就不再需要类似的遍历接口了。这样就简化了聚合的接口。

3、在同一个聚合上可以有多个遍历。每个迭代器保持它自己的遍历状态。因此你可以同时进行多个遍历。

当由客户来控制迭代时,该迭代器称为一个外部迭代器,而当由迭代器控制迭代时,该迭代器称为一个内部迭代器。使用外部迭代器的客户必须主动推进遍历的步伐,显式地向迭代器请求下一个元素。相反地,若使用内部迭代器,客户只需要向其提交一个待执行的操作,而迭代器将对聚合中的每一个元素实施该操作。

如果迭代器负责遍历算法,那么将易于在相同的聚合上使用不同的迭代算法,同时也易于在不同的聚合上重用相同的算法。从另一方面说,遍历算法可能需要访问聚合的私有变量。如果这样,将遍历算法放入迭代器中会破坏聚合的封装性。

在遍历一个聚合的同时更改这个聚合可能是危险的。如果在遍历聚合的时候增加或删除该聚合元素,可能会导致两次访问同一个元素或者遗漏某个元素。一个简答的解决办法是拷贝该聚合,并对该聚合实施遍历,但一般来说这样做代价太高。

当插入或删除元素时,该聚合那么调整迭代器的内部状态,要么在内部的维护额外的信息以保证正确的遍历。

迭代器和聚合紧密耦合。

一个空迭代器是一个退化的迭代器,它有助于处理边界条件。根据定义,一个NullIterator总是已经完成了遍历,即它的IsDone操作总是返回true。

空迭代器使得更容易遍历树形结构的聚合(如复合对象)。在遍历过程中的每一节点,都可向当前的元素请求遍历其各个子节点的迭代器。该聚合元素将返回一个具体的迭代器。但叶节点元素返回NullIterator的一个实例。这就使我们可以用一种统一的方式实现在整个结构上的遍历。

Composite模式:迭代器常被应用到像复合这样的递归结构上。

Memento模式:常与迭代器模式一起使用。迭代器可使用一个memento来捕获一个迭代的状态。迭代器在其内部存储memento。

猜你喜欢

转载自linshiquan.iteye.com/blog/1066694