行为模式之迭代器模式

迭代器模式(Iterator Pattern)是最常被使用的几个模式之一,被广泛地应用到Java的API中。

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

类图如下所示。

 

 迭代器模式有以下4个角色。

  • 抽象迭代器(Iterator)角色:负责定义访问和遍历元素的接口。
  • 具体迭代器(Concrete Iterator)角色:实现Iterator接口,完成容器元素的遍历。
  • 抽象聚集(Aggregate)角色:提供创建迭代器角色的接口。
  • 具体聚集(Concrete Aggregate)角色:实现抽象聚集接口,创建出容纳迭代器的对象。

 Iterator.java

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

ConcreteIterator.java

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++);
        } else {
            return null;
        }
    }
    @Override
    public boolean hasNext() {
        return index < size;
    }
}

Aggregate.java

public interface Aggregate {
    public void add(Object obj);
    public Iterator createIterator();
}

ConcreteAggregate.java

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 < this.vector.size()) {
            return vector.get(index);
        } else {
            return null;
        }
    }
    public int size() {
        return vector.size();
    }
    @Override
    public Iterator createIterator() {
        return new ConcreteIterator(this);
    }
}

Client.java

public class Client {
    public static void main(String[] args) {
        // 定义聚集对象
        Aggregate agg = new ConcreteAggregate();
        agg.add("张三");
        agg.add("李四");
        agg.add("王五");
        // 遍历
        Iterator iterator = agg.createIterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
    }
}

运行结果如下所示。

张三
李四
王五

优点:

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

缺点:

  • 给使用者一个序列化的错觉,从而产生错误。

应用场景:

  • 在java开发中,尽量不要自己写迭代器模式,使用Java API提供的Iterator一般就能满足项目要求。

摘自:

青岛东合信息技术有限公司 . 设计模式(Java版) .  电子工业出版社,2012,133-138.

原文地址:https://www.cnblogs.com/yewen1234/p/10030726.html