迭代器模式是行为型设计模式的一种,其核心思想是提供一种方法顺序访问一个聚合对象中的各个元素

📅 2026/7/6 15:37:34 👁️ 阅读次数 📝 编程学习
迭代器模式是行为型设计模式的一种,其核心思想是提供一种方法顺序访问一个聚合对象中的各个元素

迭代器模式是行为型设计模式的一种,其核心思想是提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示。迭代器模式将遍历集合的责任从集合对象中分离出来,由迭代器对象负责,既可以隐藏集合的内部实现,又可以提供统一的遍历接口。

核心特点

访问聚合对象的内容而不需要暴露它的内部表示

遍历任务交由迭代器完成,简化了聚合类的设计

支持以不同的方式遍历一个聚合对象,甚至可以自定义迭代器的子类以支持新的遍历方式

在同一个聚合上可以有多个遍历,每个迭代器保持自己的遍历状态

新增聚合类和迭代器类都很方便,无需修改原有代码,符合开闭原则

核心角色

抽象迭代器(Iterator):定义遍历元素的接口,通常包含hasNext()、next()、remove()等方法

具体迭代器(Concrete Iterator):实现抽象迭代器接口,完成对聚合对象的遍历,记录遍历的当前位置

抽象聚合(Aggregate):定义创建迭代器对象的接口,返回一个迭代器对象

具体聚合(Concrete Aggregate):实现抽象聚合接口,返回一个合适的具体迭代器实例

客户端(Client):通过迭代器遍历聚合对象中的元素,不需要关心聚合对象的内部结构

二、适用场景

迭代器模式通常应用于以下场景:

隐藏内部结构:需要访问一个聚合对象的内容而不想暴露它的内部表示

多种遍历方式:需要为聚合对象提供多种遍历方式

统一遍历接口:为遍历不同的聚合结构提供一个统一的接口,支持多态迭代

分离遍历逻辑:遍历逻辑复杂,不希望和聚合类耦合在一起

并发安全:在遍历过程中需要保护聚合对象不被修改,或者支持并发遍历

三、UML类图结构

┌─────────────────────────────┐
│ Aggregate │
├─────────────────────────────┤
│+createIterator(): Iterator │
└─────────────────────────────┘


┌─────────────────────────────┐
│ ConcreteAggregate │
├─────────────────────────────┤
│-items: List │
├─────────────────────────────┤
│+createIterator(): Iterator │
│+getItem(index): Object │
│+size(): int │
└─────────────────────────────┘


┌─────────────────────────────┐
│ Iterator │
├─────────────────────────────┤
│+hasNext(): boolean │
│+next(): Object │
│+remove() │
└─────────────────────────────┘


┌─────────────────────────────┐
│ ConcreteIterator │
├─────────────────────────────┤
│-aggregate: ConcreteAggregate│
│-position: int │
├─────────────────────────────┤
│+hasNext(): boolean │
│+next(): Object │
│+remove() │
└─────────────────────────────┘

结构说明:具体聚合类实现创建迭代器的接口,返回对应的具体迭代器实例。具体迭代器持有聚合对象的引用,记录当前遍历的位置,实现遍历方法。客户端通过迭代器接口遍历聚合对象,不需要了解聚合的内部结构。

四、代码实现示例

以自定义的学生列表为例,实现迭代器模式遍历学生信息。

1. 抽象迭代器接口

2. 抽象聚合接口

3. 具体聚合类(学生列表)

4. 具体迭代器(正序遍历)

5. 具体迭代器(倒序遍历)

6. 客户端使用示例

五、Java集合框架中的迭代器应用

Java集合框架广泛使用了迭代器模式,所有的集合类都实现了Iterable接口,提供了iterator()方法返回迭代器对象。

六、优缺点分析

七、典型应用案例

Java集合框架:Collection接口继承了Iterable接口,所有集合类都支持迭代器遍历

Java增强for循环:for-each语法糖本质上就是迭代器的封装,只能用于实现了Iterable接口的类

数据库结果集遍历:JDBC中的ResultSet游标本质上就是迭代器模式的应用,用于遍历查询结果

树形结构遍历:文件系统、XML/HTML DOM树等树形结构的遍历,通过迭代器模式实现深度优先、广度优先等不同遍历方式

分页查询:大数据量的分页查询可以通过迭代器模式封装,客户端透明地遍历所有数据,不需要关心分页逻辑

函数式编程:Java 8中的Stream API、RxJava等响应式编程框架中的数据流遍历本质上也是迭代器模式的扩展

八、与其他模式的对比

九、注意事项

迭代器遍历过程中,如果聚合结构发生变化(添加、删除元素),迭代器可能会抛出ConcurrentModificationException异常(fail-fast机制)

删除元素时必须使用迭代器的remove()方法,不要直接调用聚合类的remove()方法,否则可能导致遍历异常

对于简单的集合遍历,优先使用Java提供的迭代器实现,不需要自定义迭代器

自定义迭代器时要考虑线程安全问题,多线程环境下遍历需要加锁或者使用并发集合类

迭代器只能单向移动(除了ListIterator支持双向遍历),如果需要复杂的遍历操作可以考虑自定义迭代器

对于不可变集合,迭代器可以设计为不可修改的,remove()方法抛出UnsupportedOperationException

大数据量的遍历要注意内存占用,避免一次性加载所有数据到内存,可以实现支持懒加载的迭代器