纵有疾风起
人生不言弃

设计模式十七–迭代器模式

定义

提供一种方法访问一个容器对象中的各个元素,而又不需要暴露该对象内部的各个细节。

迭代器模式的角色

1:抽象迭代器角色(Iterator)
该角色负责定义访问和遍历元素的接口。

public interface Iterator{  public Object next();  public Object hasNext();}

2:具体迭代器角色(ConcreteIterator)
该角色实现迭代器接口,完成容器元素的遍历。

public class ConcreateIterator implements Iterator{  private ConcreateAggregate agg;  private int index;  private int size;  public ConcreateIterator (ConcreateAggregate  agg){    this.agg = agg;    this.index = 0;    this.size = agg.size;  }  //是否有下一个角色  public boolean hasNext(){    return index < size;  }  //获取下一个角色  public Object next(){    if(index < next){      return agg.getElement(index++);    }else{      return null;     }  }}

3:抽象聚集(Aggregate)
该角色提供创建迭代器角色的接口。

 public interface Aggregate{    public void add(Obejct obj);    public Iterator iterator(); } 

4:具体聚集(ConcreateAggregate)
该角色实现抽象聚集接口,创建出胡容纳迭代器的对象。

public class ConcreateAggregate implements Aggregate{  public Vector vector = new Vector();   public void add(Object obj){        this.vector.add(obj);  }  public Object getElement(int index){    if(index < vector.size()){      return vector.get(index);    }else{      return null;    }  }  public int size(){    return this.vector.size();  }  public Iterator iterator(){    return new ConcreateIterator(this);  }}

客户端代码:

public class Client{  public static void main(String [] args){    ConcreateAggregate  agg = new ConcreateAggregate();    agg.add(1);    agg.add(2);    agg.add(3);    Iterator iterator = agg.iterator();    while(iterator.hasNext()){      System.out.println(iterator.next());    }  }}

优点

1:迭代器简化了访问容器元素的操作,具备一个统一访问的接口。
2:封装遍历算法,使算法独立于聚集角色,即是聚集对象类型变化,遍历算法也不会变化。

缺点

1:迭代器模式给使用者一种序列化的错觉,从而产生错误。
2:迭代器的元素都是Object类型,jdk1.5以后才有了泛型的概念。

使用场景

java.util.Iterator接口,就是原生的迭代器,实现的集合类有 Collection、ArrayList、Vector、Stack、HashSet、EntrySet等

目前迭代器模式因为jdk1.2以后有了java.util.Iterator,所以迭代器已经普遍应用于数组集合的遍历当中。

参考资料:设计模式(java)

文章转载于:https://www.jianshu.com/p/b7b55c013a54

原著是一个有趣的人,若有侵权,请通知删除

未经允许不得转载:起风网 » 设计模式十七–迭代器模式
分享到: 生成海报

评论 抢沙发

评论前必须登录!

立即登录