ITERATOR(迭代器)设计模式

时间:2023-03-09 04:52:07
ITERATOR(迭代器)设计模式

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

2 别名(Cursor)

3 动机:队列表的访问和遍历从列表对象中分离出来放入一个迭代器对象中。

  多态迭代

  抽象的列表类,提供列表的公共接口。类似的也需要一个抽象的Iterator,公共的迭代接口。

列表对象提供CreateIterator(是Factory Method)

4 适用性:

.访问聚合对象内容而无需暴露它的内部表示

.支持该聚合对象的多种遍历

.为遍历不同的聚合结构提供一个统一的接口(支持多台迭代)

5 参与者:

Iterator:定义访问和遍历元素的接口

ConcreteIterator:具体迭代器实现迭代的接口。对聚合遍历时跟踪当前位置。

Aggregate:聚合定义创建相应迭代器对象的接口

ConcreteAggregate:具体聚合实现创建相应迭代器的接口,该操作返回ConcreteIterator的一个适当的实例。

6 ConcreteIterator 跟踪聚合中的当前对象,能计算出遍历的后继对象。

7 效果:

1)支持不同的方式遍历一个聚合

2)简化了聚合的接口

3)同一个聚合上可以有多个遍历

8 实现:

1)谁控制迭代

客户控制迭代时,外部迭代器。客户主动请求下一个元素

迭代器控制迭代时,内部迭代器。客户只需要指定一个有待执行的操作

2)谁定义算法遍历:

3)迭代器的健壮程度如何:

遍历迭代器的同时更改迭代器是危险的。

4)附加迭代的操作

5)C++中使用多台的迭代器:

要求使用Factory Method动态分配迭代器对象。缺点:客户必须删除迭代器。

Proxy提供了一个补救方法。可以使用一个栈分配的Proxy作为实际迭代器的代理。在Proxy的析构函数里删除迭代器。

6)迭代器可有特权访问:

迭代器作为聚合的友元,这样就是紧密的耦合。

特权遍历使得生成新的遍历很困难,因为要求聚合增加友元。

解决办法,迭代器类包含protected操作访问聚合类的重要的非公共可见的成员,迭代器子类可使用protected操作得到聚合的特权访问。

7)用于复合对象的迭代器:

Composite模式,使用内部迭代器更方便一些。

如果复合对象有一个接口从一个节点移到父节点、兄弟节点或子节点,那么基于游标的迭代器更好。

8)空迭代器:

NullIterator是一个退化的迭代器,有助于处理外部边界。

相关文章