迭代器模式是行为型设计模式的一种其核心思想是提供一种方法顺序访问一个聚合对象中的各个元素而又不暴露该对象的内部表示。迭代器模式将遍历集合的责任从集合对象中分离出来由迭代器对象负责既可以隐藏集合的内部实现又可以提供统一的遍历接口。核心特点访问聚合对象的内容而不需要暴露它的内部表示遍历任务交由迭代器完成简化了聚合类的设计支持以不同的方式遍历一个聚合对象甚至可以自定义迭代器的子类以支持新的遍历方式在同一个聚合上可以有多个遍历每个迭代器保持自己的遍历状态新增聚合类和迭代器类都很方便无需修改原有代码符合开闭原则核心角色抽象迭代器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大数据量的遍历要注意内存占用避免一次性加载所有数据到内存可以实现支持懒加载的迭代器