• 设计模式--迭代器模式


    设计模式--迭代器模式

    1、迭代器模式

      迭代器模式:又称为游标(cursor)模式,也就是抽象一个迭代器类来分离聚集的遍历行为,这样既可以做到不暴露聚集的内部结构,又可让外部代码透明地访问聚集内部的数据。

    2、迭代器模式的结构

    • 角色

      抽象聚合角色:定义存储、添加、删除聚合对象以及创建迭代器对象的接口;

      具体聚合角色:实现抽象聚合类,返回一个具体迭代器的实例;

      抽象迭代器角色:定义访问和遍历聚合元素的接口,通常包含first()、next() 等方法;

      具体迭代器角色:实现抽象迭代器接口中所定义的方法,完成对聚合对象的遍历,记录遍历的当前位置。

    • 类图

    3、迭代器模式举例

    抽象聚合接口:Aggregate.java

    1 package iterator;
    2 /**
    3  * 抽象聚合接口
    4  * @author nick
    5  *
    6  */
    7 public interface Aggregate {            
    8     public abstract Iterator createIterator();  //定义抽象方法,返回迭代器类对象
    9 }

    具体聚合类:ConcreteAggregate.java

     1 package iterator1;
     2 /**
     3  * 具体聚合角色
     4  * @author nick
     5  */
     6 public class ConcreteAggregate implements Aggregate {
     7         
     8         private Object[] objArray = null;       //定义对象数组
     9     
    10         public ConcreteAggregate(Object[] objArray){
    11             //传入聚合对象的具体内容
    12             this.objArray = objArray;
    13         }   
    14     
    15         /**
    16          * 实现聚合接口
    17          * 调用具体迭代器中的构造方法
    18          * 返回具体迭代器迭代器对象
    19          */
    20         @Override
    21         public Iterator createIterator() {
    22             return new ConcreteIterator(this);
    23         }
    24     
    25         //获取聚集的大小
    26         public int size(){
    27             return objArray.length;
    28         }
    29     
    30         // 获取聚集内的元素
    31         public Object getElement(int index){     
    32             if(index < objArray.length){
    33                 return objArray[index];
    34             }else{
    35                 return null;
    36             }
    37         }    
    38 }

    抽象迭代器接口:Iterator.java

     1 package iterator1;
     2 /**
     3  * 抽象迭代器接口
     4  * @author nick
     5  */
     6 public interface Iterator {
     7  8     void first();           //移动到第一个元素 
     9     void next();            //移动到下一个元素
    10     boolean isLast();       //是否是最后一个元素 
    11     Object currentItem();   //获取当前元素
    12 }

    具体迭代器类:ConcreteIterator.java

     1 package iterator1;
     2 /**
     3  * 具体的迭代器
     4  * @author nick
     5  */
     6 public class ConcreteIterator implements Iterator {
     7     private ConcreteAggregate agg;  //持有被迭代的具体的聚合对象
     8     private int index = 0;          //内部索引,记录当前迭代到的索引位置  
     9     private int size = 0;           //记录当前聚集对象的大小  
    10     
    11     public ConcreteIterator(ConcreteAggregate agg){
    12         this.agg = agg;
    13         this.size = agg.size();
    14         index = 0;
    15     } 
    16     
    17     @Override//移动到第一个元素
    18     public void first() {   
    19         index = 0;
    20     } 
    21     
    22     @Override//元素后移
    23     public void next() {
    24         if(index < size)
    25         {
    26             index ++;
    27         }
    28     }
    29     
    30     @Override//判断是否为最后一个元素
    31     public boolean isLast() {  
    32         return (index >= size)? true :false;
    33     }
    34     
    35     @Override//获取索引处的元素和
    36     public Object currentItem() {    
    37         return agg.getElement(index);       
    38     }
    39 }

    主程序:Application.java

     1 package iterator1;
     2 /**
     3  * 主程序入口
     4  * @author nick
     5  */
     6 public class Application {
     7     public static void main(String[] args) {  
     8          
     9         Object[] objArray = {"One","Two","Three","Four","Five","Six"};     
    10          Aggregate agg = new ConcreteAggregate(objArray);//创建聚合对象      
    11          //调用聚合对象中实现的创建迭代器的方法创建迭代器
    12          Iterator iter = agg.createIterator(); 
    13          while(!iter.isLast()){//用迭代器遍历聚合对象中的元素和    
    14              System.out.println(iter.currentItem());
    15              iter.next();           
    16          }
    17     }
    18 }

    运行结果

      

    4、迭代器模式的优缺点

    • 优点1:迭代器模式简化了聚集的接口。迭代器具备了一个遍历接口,这样聚集的接口就不必具备遍历接口。

    • 优点2: 由于遍历算法被封装在迭代器角色里面,因此迭代的算法可以独立于聚集角色变化。

    • 优点3:在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码。

    • 缺点1:迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性。

  • 相关阅读:
    一个日期Js文件。 2013年10月12日 星期六 癸巳年九月初八
    【Cocosd2d实例教程二】地图编辑器Tiled的安装使用
    结构体快排qsort()
    Crypto API加密通信流程
    LA 4255 Guess
    hdu1005 Number Sequence(数论)
    c++异常 连续抛出异常
    IMP导入数据 报错 IMP-00058 ORA-01691 IMP-00028
    Groovy/Spock 测试导论
    Groovy 与 DSL
  • 原文地址:https://www.cnblogs.com/sinlearn/p/11881506.html
Copyright © 2020-2023  润新知