zoukankan      html  css  js  c++  java
  • 迭代器(Iterator)模式

    转自:http://blog.csdn.net/lilu_leo/article/details/7609496

    概述

         迭代器(Iterator)模式,又叫做游标(Cursor)模式。GOF给出的定义为:提供一种方法访问一个容器(container)对象中各个元素,而又不需暴露该对象的内部细节。

    在面向对象的软件设计中,我们经常会遇到一类集合对象,这类集合对象的内部结构可能有着各种各样的实现,但是归结起来,无非有两点是需要我们去关心的:一是集合内部的数据存储结构,二是遍历集合内部的数据。面向对象设计原则中有一条是类的单一职责原则,所以我们要尽可能的去分解这些职责,用不同的类去承担不同的职责。Iterator模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可让外部代码透明的访问集合内部的数据。

    1.通俗的来说,就是,别人可能要用到我们的容器元素,但是我只想让他用元素,不想让他知道容器是怎么样的。也就是最基本的,访问各个元素而不暴露容器内部细节。

    2.我们有可能以一种以上的方式遍历容器元素

    3.同时对容器元素进行多次遍历。因为迭代器会保存当前的遍历状态,所以可以通过迭代器模式来达到这种需求。

    意图

        提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示。[GOF 《设计模式》]

    结构图

        Iterator模式结构图如下:

     

     

     

    由下面四个角色:
      1) 迭代器角色(Iterator):迭代器角色负责定义访问和遍历元素的接口。

      2) 具体迭代器角色(Concrete Iterator):具体迭代器角色要实现迭代器接口,并要记录遍历中的当前位置。

      3) 容器角色(Container):容器角色负责提供创建具体迭代器角色的接口。

      4) 具体容器角色(Concrete Container):具体容器角色实现创建具体迭代器角色的接口——这个具体迭代器角色于该容器的结构相关。

    代码小例子

           迭代器(Iterator)

     
    1. public interface Iterator {  
    2.     String next();  
    3.     boolean haveNext();  
    4. }  


        具体迭代器角色(Concrete Iterator)


     

    1. public class TVChannel implements Iterator{  
    2.     private String[] tvChannel ={"cctv-1","cctv-2","cctv-3","cctv-4","cctv-5","cctv-6","cctv-7"};  
    3.     private int current = 0;  
    4.     @Override  
    5.     public String next() {  
    6.         if(haveNext()){  
    7.             return tvChannel[current++];  
    8.         }  
    9.         return null;  
    10.         // TODO Auto-generated method stub  
    11.           
    12.     }  
    13.   
    14.     @Override  
    15.     public boolean haveNext() {  
    16.         // TODO Auto-generated method stub  
    17.           
    18.         if(current<tvChannel.length){  
    19.             return true;  
    20.         }  
    21.         return false;  
    22.     }  
    23.   
    24. }  

    容器角色(Container)


     
    1. public interface IContainer {  
    2.     Iterator createrIterator();  
    3. }  



    具体容器角色(Concrete Container):


     
    1. public class TV implements IContainer{  
    2.     public TV(){  
    3.         System.out.println("open a tv");  
    4.     }  
    5.     public Iterator createrIterator(){  
    6.         return new TVChannel();  
    7.     }  
    8. }  

    测试使用:


     
    1. public static void main(String[] args) {  
    2.         // TODO Auto-generated method stub  
    3.         IContainer tv = new TV();  
    4.         Iterator iterator = tv.createrIterator();  
    5.         while(iterator.haveNext()){  
    6.             System.out.println("TVChennel:"+iterator.next());  
    7.         }  
    8.     }  

    一个简单的容器为什么还要定义成一个接口呢?想想针对接口编程,不针对具体实现编程!如果要拓展,使用接口更方便些。

    测试结果:


     
    1. open a tv  
    2. TVChennel:cctv-1  
    3. TVChennel:cctv-2  
    4. TVChennel:cctv-3  
    5. TVChennel:cctv-4  
    6. TVChennel:cctv-5  
    7. TVChennel:cctv-6  
    8. TVChennel:cctv-7  



    效果及实现要点

    1.    迭代抽象:访问一个聚合对象的内容而无需暴露它的内部表示。
    2.    迭代多态:为遍历不同的集合结构提供一个统一的接口,从而支持同样的算法在不同的集合结构上进行操作。
    3.    迭代器的健壮性考虑:遍历的同时更改迭代器所在的集合结构,会导致问题。

    总结

        Iterator模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可让外部代码透明的访问集合内部的数据。

    迭代器模式的作用:
    1. 它支持以不同的方式遍历一个聚合对象 : 复杂的聚合可用多种方式进行遍历。迭代器模式使得改变遍历算法变得很容易 : 仅需用一个不同的迭代器的实例代替原先的实例即可。你也可以自己定义迭代器的子类以支持新的遍历。
    2.  迭代器简化了聚合的接口 有了迭代器的遍历接口,聚合本身就不再需要类似的遍历接口了。这样就简化了聚合的接口。
    3. 在同一个聚合上可以有多个遍历 每个迭代器保持它自己的遍历状态。因此你可以同时进行多个遍历。
    4. 在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码,满足“开闭原则”的要求。
    迭代器模式的缺点
           由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性。

    适用情况


    由上面的讲述,我们可以看出迭代器模式给容器的应用带来以下好处:

    1.   支持以不同的方式遍历一个容器角色。根据实现方式的不同,效果上会有差别。
    2.   简化了容器的接口。但是在java Collection中为了提高可扩展性,容器还是提供了遍历的接口。
    3.   对同一个容器对象,可以同时进行多个遍历。因为遍历状态是保存在每一个迭代器对象中的。


      由此也能得出迭代器模式的适用范围:

      1.   访问一个容器对象的内容而无需暴露它的内部表示。
      2.   支持对容器对象的多种遍历。
      3.   为遍历不同的容器结构提供一个统一的接口(多态迭代)。          
  • 相关阅读:
    BNU 51002 BQG's Complexity Analysis
    BNU OJ 51003 BQG's Confusing Sequence
    BNU OJ 51000 BQG's Random String
    BNU OJ 50999 BQG's Approaching Deadline
    BNU OJ 50998 BQG's Messy Code
    BNU OJ 50997 BQG's Programming Contest
    CodeForces 609D Gadgets for dollars and pounds
    CodeForces 609C Load Balancing
    CodeForces 609B The Best Gift
    CodeForces 609A USB Flash Drives
  • 原文地址:https://www.cnblogs.com/catWang/p/4213510.html
Copyright © 2011-2022 走看看