zoukankan      html  css  js  c++  java
  • 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是一个退化的迭代器,有助于处理外部边界。

      

  • 相关阅读:
    洛谷 P1981 表达式求值
    1696:逆波兰表达式
    C# winform选择文件、选择文件夹、打开文件
    建立二叉树的二叉链表存储结构(严6.70)
    二叉树的深度
    Sequence
    c++优先队列(priority_queue)用法详解
    二叉树的操作
    [清华集训2015]灯泡(浙江大学ZOJ 3203 Light Bulb)
    Go 和 Colly笔记
  • 原文地址:https://www.cnblogs.com/criticalsection/p/5688553.html
Copyright © 2011-2022 走看看