Skip to content

能在不暴露集合底层表现形式 (列表、 栈和树等) 的情况下遍历集合中所有的元素,属于行为型模式,应该是java中应用最多的设计模式之一。

TIP

提到迭代器,想到它是与集合相关的,集合也叫容器,可以将集合看成是一个可以包容对象的容器,例如List,Set,Map,甚至数组都可以叫做集合,迭代器的作用就是把容器中的对象一个一个地遍历出来。

编码实战

自定义一个集合容器,并实现里面的迭代器功能,List集合容器的简化版本

抽象迭代器

java
public interface MyIterator {

    /**
     * 获取下一个元素
     * @return
     */
    Object next();

    /**
     * 是否有下一个元素
     * @return
     */
    boolean hasNext();

    /**
     * 删除元素
     * @param obj
     * @return
     */
    Object remove(Object obj);
}

实现/具体 迭代器

java
public class ConcreteIterator implements MyIterator{

    private List list;

    private int index = 0;

    public ConcreteIterator(List list) {
        this.list = list;
    }

    @Override
    public Object next() {
        Object obj = null;
        if (this.hasNext()){
            // 如果有则返回
            obj = this.list.get(index);
            index++;
        }
        return obj;
    }

    @Override
    public boolean hasNext() {
        if (index == list.size()){
            return false;
        }
        return true;
    }

    @Override
    public Object remove(Object obj) {
        return list.remove(obj);
    }
}

抽象容器

java
public interface ICollection {

    void add(Object obj);

    void remove(Object obj);

    MyIterator iterator();

}

具体容器

java
public class MyCollection implements ICollection{

    private List list = new ArrayList();

    @Override
    public void add(Object obj) {
        list.add(obj);
    }

    @Override
    public void remove(Object obj) {
        list.remove(obj);
    }

    @Override
    public MyIterator iterator() {
        return new ConcreteIterator(list);
    }
}

使用

java
public static void main(String[] args) {
    ICollection collection = new MyCollection();
    collection.add("雷军");
    collection.add("董明珠");

    MyIterator iterator = collection.iterator();
    while (iterator.hasNext()) {
        Object obj = iterator.next();
        System.out.println(obj);
    }

}

小结

  • 优点

    1. 可以做到不暴露集合的内部结构,又可让外部代码透明地访问集合内部的数据
    2. 支持以不同的方式遍历一个聚合对象
  • 缺点

    1. 对于比较简单的遍历(像数组或者有序列表),使用迭代器方式遍历较为繁琐
    2. 迭代器模式在遍历的同时更改迭代器所在的集合结构会导致出现异常