迭代器模式

行为型模式

访问次数: 10

迭代器模式提供一种方法顺序访问一个聚合对象中各个元素,而又无须暴露该对象的内部表示。

类图
classDiagram
    class Iterator {
        <<interface>>
        +hasNext() boolean
        +next() Object
    }
    class ConcreteIterator {
        -aggregate: ConcreteAggregate
        -current: int
        +hasNext() boolean
        +next() Object
    }
    class Aggregate {
        <<interface>>
        +createIterator() Iterator
    }
    class ConcreteAggregate {
        -items: List~Object~
        +createIterator() Iterator
        +addItem(item: Object)
        +getItem(index: int) Object
        +getCount() int
    }
    Iterator <|-- ConcreteIterator
    Aggregate <|-- ConcreteAggregate
    ConcreteIterator --> ConcreteAggregate
源代码示例
// 迭代器接口
interface Iterator {
    boolean hasNext();
    Object next();
}

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

// 具体聚合类
class ConcreteAggregate implements Aggregate {
    private List<Object> items = new ArrayList<>();
    
    public void addItem(Object item) {
        items.add(item);
    }
    
    public Object getItem(int index) {
        return items.get(index);
    }
    
    public int getCount() {
        return items.size();
    }
    
    @Override
    public Iterator createIterator() {
        return new ConcreteIterator(this);
    }
}

// 具体迭代器
class ConcreteIterator implements Iterator {
    private ConcreteAggregate aggregate;
    private int current = 0;
    
    public ConcreteIterator(ConcreteAggregate aggregate) {
        this.aggregate = aggregate;
    }
    
    @Override
    public boolean hasNext() {
        return current < aggregate.getCount();
    }
    
    @Override
    public Object next() {
        if (hasNext()) {
            return aggregate.getItem(current++);
        }
        return null;
    }
}
# Python代码待添加
应用场景
当需要遍历聚合对象中的元素,且不希望暴露聚合对象的内部结构时。应用场景包括: 1)遍历集合中的元素,提供统一的遍历接口,隐藏底层数据结构 2)遍历树形结构中的节点,支持深度优先、广度优先等不同遍历方式 3)数据库查询结果遍历,将复杂的数据库操作封装成简单的迭代器接口 4)文件系统遍历,遍历目录和文件,支持递归和非递归遍历 5)XML/JSON文档遍历,遍历文档中的元素和属性 6)图形数据结构遍历,遍历图中的节点和边,支持不同的遍历算法
精选场景详解 —— 集合遍历:不暴露内部结构的统一迭代
问题背景

业务既用数组列表,又用链表、哈希表。若让调用方直接操作底层结构,会泄露封装,且遍历写法无法统一。

模式如何解决
选用迭代器模式:Aggregate 提供 createIterator();Iterator 提供 hasNext/next。客户端只依赖迭代器接口遍历元素。 好处: 1)隐藏 List/Tree/Graph 等内部表示; 2)支持多种遍历策略(如树的前序/后序可对应不同迭代器); 3)符合单一职责:集合管存储,迭代器管游标。 Java 的 Iterator、C# 的 IEnumerator、foreach 语法都是该模式的语言级体现。
场景模型(角色映射)

将模式中的抽象角色映射到该业务领域的具体类:

classDiagram
    class Iterator {
        <<interface>>
        +hasNext() bool
        +next() Object
    }
    class ListIterator {
        -list: ArrayListAggregate
        -index: int
        +hasNext() bool
        +next() Object
    }
    class Aggregate {
        <<interface>>
        +createIterator() Iterator
    }
    class ArrayListAggregate {
        -items: Object[]
        +createIterator() Iterator
        +add(item: Object)
    }
    class ReportService {
        +printAll(agg: Aggregate)
    }
    Iterator <|.. ListIterator
    Aggregate <|.. ArrayListAggregate
    ArrayListAggregate --> ListIterator : creates
    ListIterator --> ArrayListAggregate
    ReportService --> Aggregate
    ReportService --> Iterator