java设计模式笔记

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

2019-03-30  本文已影响0人  朽木亦自雕

定义

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

迭代器模式的角色

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)

上一篇下一篇

猜你喜欢

热点阅读