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是一个退化的迭代器,有助于处理外部边界。

 

  

转载于:https://www.cnblogs.com/criticalsection/p/5688553.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值