设计模式-迭代器模式(19)

定义

迭代器模式(Iterator Pattern)是使用率最高的几个模式之一,被广泛地应用到Java的API中。例如:Java的集合(Collection)框架中,就广泛使用迭代器来遍历集合中元素。

英文原话:Provide a way to access the elements of an aggregate object sequentially without exposing its underlying representation.

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

迭代器是为容器服务的,容器是指用来容纳其他对象的对象,例如:Collection集合类型、Set类型等。迭代器模式便于遍历和访问容器中的元素。

角色:

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

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

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

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

/**
 * 抽象迭代器
 */
public interface Iterator {
    //下一个
    public Object next();
    //是否有下一个
    public boolean hasNext();
}

/**
 * 具体迭代器
 */
public class ConcreteIterator implements Iterator{
    private ConcreteAggregate agg;     //集合类
    private int index = 0;    //下标
    private int size = 0;    //大小

    //将集合类传入迭代器
    public ConcreteIterator(ConcreteAggregate agg) {
        this.agg = agg;
        size = agg.size();
        index = 0;
    }

    /**
     * 返回下一个元素
     */
    @Override
    public Object next() {
        if (index<size) {
            return agg.getElement(index++);
        }
        return null;
    }

    /**
     * 是否有下一个元素,即是否遍历结束
     */
    @Override
    public boolean hasNext() {
        return index<size;
    }
}

/**
 * 聚集类接口
 */
public interface Aggregate {
    public void add(Object obj);    //添加元素
    public Iterator creatIterator();    //创建迭代器
}

/**
 * 具体聚集类
 */
public class ConcreteAggregate implements Aggregate {
    private Vector vector = new Vector();

    //添加元素
    @Override
    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 vector.size();
    }

    //创建迭代器
    @Override
    public Iterator creatIterator() {
        return new ConcreteIterator(this);
    }
}
public static void main(String[] args) {
Aggregate agg = new ConcreteAggregate(); //相当于List list = new ArrayList();
agg.add("元素1");
agg.add("元素2");
agg.add("元素3");
//遍历
Iterator iterator = agg.creatIterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
}

源码

优点

  • 迭代器模式简化了访问容器元素的操作,具备统一的遍历接口。
  • 封装遍历算法,使算法独立于聚集角色。客户无需知道聚集对象的类型,即使聚集对象的类型发生变化,也不会影响遍历过程。

缺点

  • 迭代器模式给使用者一种序列化的错觉,而产生错误。
  • 迭代器的元素都是Object类型,没有类型特征(JDK1.5之后引入泛型可以解决此问题)。

应用场景

迭代器模式现在被广泛的应用甚至已经成为一个最基础的工具。有些人建议将迭代器从23中模式删除,器原因就是迭代器模式太普通了,它已经融入到各种语言和各工具中。在Java语言中,从JDK1.2版本开始,就增加了java.util.Iterator接口,并将Iterator应用到各个聚集类(Collection)中,如ArrayList、Vector、Stack、HashSet等集合类都实现了iterator()方法,返回一个迭代器Iterator,便于对集合中的元素进行遍历。也正因为Java已经将迭代器模式融入最基本的API中,程序员在项目中无需再独立的写迭代器,直接使用即可。

点赞

Leave a Reply

Your email address will not be published. Required fields are marked *