Iterator - 迭代器设计模式

7 阅读2分钟

什么是迭代器模式?

迭代器模式(Iterator Pattern)是 Java 和 .Net 编程环境中非常常用的设计模式。这种模式可以基于特定接口按顺序访问集合中的各个元素,而且无需了解其具体特性。迭代器模式属于行为型模式。Java 集合的顶层接口 Collection 继承了 Iterable 接口,进而所有 Java 集合实现类全部要支持 iterator() 方法,就是迭代器模式一个具体应用。

优缺点

优点:

1.将聚合类中数据存储和数据遍历职责解耦,使得聚合类可以只关注自身数据结构。
2.客户端无需了解聚合类的数据结构,使用统一的 Iterator 接口来遍历数据。
3.聚合类可以拥有多种迭代器以供选择,不需要改动代码去调整遍历顺序。

缺点:

  1. 由于具体的遍历类和聚合类是成对出现的,因此类的数量会增加。

示例

// 抽象聚合类,定义 getIterator 的方法,要求所有具体聚合类要按照自己的数据结构去各自实现
abstract class Aggregate<E> {
    protected abstract Iterator<E> getIterator();
}

// 迭代器接口,定义遍历元素所需的标准的操作方法
interface Iterator<E> {
    boolean hasNext();
    E next();
    boolean isDone();
}

// 具体聚合类,其数据结构是个数组,当然也可以是ArrayList, Set, LinkedList 等等。
class NameList<E> extends Aggregate<E> {
    private E[] elements;
    public NameList(E[] elements) {
        this.elements = elements;
    }
    @Override
    public Iterator<E> getIterator() {
        return new NameIterator<E>(elements);
    }
}

// 具体迭代器,基于特定数据机构去实现遍历所需的方法 
class NameIterator<E> implements Iterator<E> {
    private E[] elements;
    private int idx = 0;
    public NameIterator(E[] elements) {
        this.elements = elements;
    }
    @Override
    public boolean hasNext() {
        return idx + 1 <= elements.length;
    }
    @Override
    public E next() {
        if (idx < elements.length) {
            return elements[idx++];
        }
        return null;
    }
    @Override
    public boolean isDone() {
        return idx >= elements.length;
    }
}
// 测试类
public static void main(String[] args) {
    final NameList<String> myList = new NameList<>(new String[] {"Lucien", "Fish", "LiuFu", "SiXi"});
    final Iterator<String> nameIterator = myList.getIterator();
    while (nameIterator.hasNext()) {
        System.out.println(nameIterator.next());
    }
}

Output

Lucien
Fish
LiuFu
SiXi