Bootstrap

行为型模式-迭代器模式

迭代器模式(Iterator Pattern)是一种行为型设计模式,主要用于提供一种方法顺序访问一个聚合对象中的各个元素,而不需要暴露其内部表示。这个模式常被用于集合类对象(如列表、数组、图等)的实现中。

模式结构

迭代器模式包括以下几个核心角色:

  • 迭代器接口(Iterator)
    定义访问和遍历元素的接口,一般包括:
    • hasNext():判断是否还有下一个元素。
    • next():返回下一个元素。
    • remove()(可选):移除当前元素。
  • 具体迭代器(Concrete Iterator)
    实现迭代器接口,维护遍历的状态(如当前位置),负责实际遍历操作。
  • 聚合接口(Aggregate)
    定义创建迭代器的接口,一般包括:
    • createIterator():返回一个具体迭代器实例。
  • 具体聚合(Concrete Aggregate)
    实现聚合接口,提供存储和管理元素的功能,并返回具体迭代器。

优缺点

  • 优点
    封装性:迭代器将遍历的实现从集合中分离出来,不暴露集合的内部结构。
    多样性:可以为不同的集合设计不同的迭代方式(如顺序迭代、反向迭代)。
    一致性:为不同集合提供统一的遍历接口,方便调用。
  • 缺点
    开销增加:增加了类的数量和复杂性,尤其是需要为每种聚合都设计一个具体迭代器时。
    不适合简单集合:对于非常简单的集合,直接遍历更高效。
    适用场景
    需要访问一个集合对象,而无需了解其底层实现。
    需要以不同方式遍历集合。
    需要为一个集合提供多种遍历方式。

示例代码

复制代码
// 迭代器接口
interface Iterator<E> {
    boolean hasNext();
    E next();
}

// 聚合接口
interface Aggregate<E> {
    Iterator<E> createIterator();
}

// 具体聚合
class ConcreteAggregate<E> implements Aggregate<E> {
    private List<E> items = new ArrayList<>();

    public void addItem(E item) {
        items.add(item);
    }

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

// 具体迭代器
class ConcreteIterator<E> implements Iterator<E> {
    private List<E> items;
    private int position = 0;

    public ConcreteIterator(List<E> items) {
        this.items = items;
    }

    @Override
    public boolean hasNext() {
        return position < items.size();
    }

    @Override
    public E next() {
        return hasNext() ? items.get(position++) : null;
    }
}

// 测试
public class IteratorPatternDemo {
    public static void main(String[] args) {
        ConcreteAggregate<String> aggregate = new ConcreteAggregate<>();
        aggregate.addItem("A");
        aggregate.addItem("B");
        aggregate.addItem("C");

        Iterator<String> iterator = aggregate.createIterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
    }
}

实际应用

Java 中的集合框架(如 ArrayList、HashMap)都实现了迭代器模式,提供 Iterator 接口来遍历集合。
数据库游标(Cursor)也是迭代器模式的一个应用。

;