CHARLIE SAYS

查理如是说
DATE 2026-08-24
THEME
SERIES / DESIGN_PATTERNS / P-113 · 设计模式

设计模式 019:迭代器(Iterator)

迭代器模式(iterator pattern)提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。客户依赖 Iterator 抽象遍历元素,而不需要知道聚合内部用的是数组还是其它结构。

意图

提供一种顺序访问聚合对象元素的方法,并且不暴露聚合对象的内部表示。

类图

  • Aggregate 是聚合类,其中 createIterator() 方法可以产生一个 Iterator;
  • Iterator 主要定义了 hasNext() 和 next() 方法;
  • Client 组合了 Aggregate,为了迭代遍历 Aggregate,也需要组合 Iterator。

原文图片丢失,据文字重绘。

classDiagram
    class Aggregate {
        <<interface>>
        +createIterator() Iterator
    }
    class ConcreteAggregate {
        -Integer[] items
        +createIterator() Iterator
    }
    class Iterator~Item~ {
        <<interface>>
        +next() Item
        +hasNext() boolean
    }
    class ConcreteIterator~Item~ {
        -Item[] items
        -int position
        +next() Object
        +hasNext() boolean
    }
    class Client
    Aggregate <|.. ConcreteAggregate
    Iterator <|.. ConcreteIterator
    ConcreteAggregate ..> ConcreteIterator : createIterator()
    Client --> Aggregate
    Client --> Iterator

实现

聚合接口和具体聚合,内部用数组保存元素,通过 createIterator() 对外提供迭代器:

public interface Aggregate {
    Iterator createIterator();
}

public class ConcreteAggregate implements Aggregate {

    private Integer[] items;

    public ConcreteAggregate() {
        items = new Integer[10];
        for (int i = 0; i < items.length; i++) {
            items[i] = i;
        }
    }

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

迭代器接口和具体实现,只暴露 hasNext() 和 next(),不暴露内部的数组:

public interface Iterator<Item> {
    Item next();
    boolean hasNext();
}

public class ConcreteIterator<Item> implements Iterator {

    private Item[] items;
    private int position = 0;

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

    @Override
    public Object next() {
        return items[position++];
    }

    @Override
    public boolean hasNext() {
        return position < items.length;
    }
}
public class Client {

    public static void main(String[] args) {
        Aggregate aggregate = new ConcreteAggregate();
        Iterator<Integer> iterator = aggregate.createIterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
    }
}

JDK 中的应用

  • java.util.Iterator
  • java.util.Enumeration

系列导航

← Angular 22+ 教程 19:DI 进阶——provide / inject / @Service / injectAsync 目录 软件工程 019:Google Java 编程风格指南 →
← 返回文章列表