Skip to content

迭代器模式

WARNING

迭代器模式使用价值远不如学习价值,Martin Flower 提出撤销此模式。C#,Java等高级编程语言已经把这个模式做在自己语言中。

但是,”研究历史为了更好地迎接未来“

迭代器模式(Iterator Pattern)是行为设计模式的一种,它提供了一种访问集合对象元素的方式,而又不需要暴露集合内部的细节。这种模式定义了一个接口来遍历集合对象,而不需要知道集合的具体实现。这样,用户代码就可以以统一的方式处理不同类型的集合,提高了代码的灵活性和可扩展性。

类图

迭代器模式

主要角色

  • 迭代器(Iterator):定义了访问和遍历集合元素的接口,包括获取下一个元素、判断是否还有下一个元素等方法。
  • 具体迭代器(ConcreteIterator):实现了迭代器接口,负责对特定集合类型进行遍历。
  • 集合(Aggregate):定义了创建相应迭代器对象的接口。
  • 具体集合(ConcreteAggregate):实现了集合接口,负责创建具体的迭代器对象。

优点

  • 分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可以让外部代码透明地访问集合内部的数据

示例

java
// 迭代器接口
interface Iterator<T> {
    boolean hasNext();
    T next();
}

// 集合接口
interface Aggregate<T> {
    Iterator<T> createIterator();
}

// 具体迭代器实现
class ConcreteIterator<T> implements Iterator<T> {
    private T[] items;
    private int position = 0;

    public ConcreteIterator(T[] items) {
        this.items = items;
    }

    @Override
    public boolean hasNext() {
        return position < items.length && items[position] != null;
    }

    @Override
    public T next() {
        T item = items[position];
        position++;
        return item;
    }
}

// 具体集合实现
class ConcreteAggregate<T> implements Aggregate<T> {
    private T[] items;

    public ConcreteAggregate(T[] items) {
        this.items = items;
    }

    @Override
    public Iterator<T> createIterator() {
        return new ConcreteIterator<>(items);
    }
}

public class Main {
    public static void main(String[] args) {
        // 创建具体集合对象
        Integer[] numbers = {1, 2, 3, 4, 5};
        Aggregate<Integer> aggregate = new ConcreteAggregate<>(numbers);

        // 使用迭代器遍历集合元素
        Iterator<Integer> iterator = aggregate.createIterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
    }
}

Released under the MIT License.