当前位置: 首页 > news >正文

Java行为型模式---迭代器模式

迭代器模式基础概念

迭代器模式(Iterator Pattern)是一种行为型设计模式,其核心思想是提供一种方法顺序访问聚合对象(如集合、列表等)中的元素,而无需暴露该对象的内部表示。迭代器模式将遍历逻辑与聚合对象分离,使聚合对象的结构和遍历算法可以独立变化。

迭代器模式的核心组件

  1. 迭代器接口(Iterator) - 定义访问和遍历元素的接口,包含hasNext()(是否有下一个元素)和next()(获取下一个元素)等方法。
  2. 具体迭代器(ConcreteIterator) - 实现迭代器接口,负责跟踪当前遍历位置,完成具体的遍历逻辑。
  3. 聚合接口(Aggregate) - 定义创建迭代器对象的接口,通常包含createIterator()方法。
  4. 具体聚合(ConcreteAggregate) - 实现聚合接口,返回具体迭代器的实例,同时存储和管理元素。
  5. 客户端(Client) - 通过聚合接口获取迭代器,再使用迭代器遍历元素,无需关心聚合对象的内部结构。

迭代器模式的实现

import java.util.ArrayList;
import java.util.List;// 1. 迭代器接口
interface Iterator {boolean hasNext();Object next();
}// 2. 聚合接口
interface Aggregate {Iterator createIterator();
}// 3. 具体迭代器(遍历自定义列表)
class ConcreteIterator implements Iterator {private final List<String> items;  // 聚合对象的元素private int position = 0;          // 当前遍历位置public ConcreteIterator(List<String> items) {this.items = items;}@Overridepublic boolean hasNext() {// 判断是否还有下一个元素return position < items.size();}@Overridepublic Object next() {// 返回当前元素并移动到下一个位置if (this.hasNext()) {return items.get(position++);}return null;}
}// 4. 具体聚合(自定义列表)
class ConcreteAggregate implements Aggregate {private final List<String> items = new ArrayList<>();public void addItem(String item) {items.add(item);}public void removeItem(String item) {items.remove(item);}@Overridepublic Iterator createIterator() {// 返回迭代器实例,关联当前聚合对象的元素return new ConcreteIterator(items);}
}// 5. 客户端代码
public class IteratorPatternClient {public static void main(String[] args) {// 创建聚合对象并添加元素ConcreteAggregate aggregate = new ConcreteAggregate();aggregate.addItem("Item 1");aggregate.addItem("Item 2");aggregate.addItem("Item 3");aggregate.addItem("Item 4");// 获取迭代器并遍历元素Iterator iterator = aggregate.createIterator();System.out.println("遍历聚合对象元素:");while (iterator.hasNext()) {String item = (String) iterator.next();System.out.println(item);}}
}

Java 内置迭代器的应用

Java 集合框架(java.util)广泛使用了迭代器模式,Iterator接口是迭代器模式的典型实现。以下是 Java 内置迭代器的使用示例:

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;public class JavaIteratorExample {public static void main(String[] args) {List<String> fruits = new ArrayList<>();fruits.add("Apple");fruits.add("Banana");fruits.add("Orange");// 获取迭代器Iterator<String> iterator = fruits.iterator();// 遍历元素System.out.println("Java内置迭代器遍历:");while (iterator.hasNext()) {String fruit = iterator.next();System.out.println(fruit);// 迭代过程中可以安全删除元素if (fruit.equals("Banana")) {iterator.remove();}}System.out.println("删除后的列表:" + fruits);  // [Apple, Orange]}
}

Java 迭代器的核心方法:

  • hasNext():判断是否有下一个元素
  • next():返回当前元素并移动到下一个位置
  • remove():删除next()返回的最后一个元素(可选操作)

迭代器模式的应用场景

  1. 聚合对象遍历 - 如列表、集合、树等复杂数据结构的遍历
  2. 隐藏内部结构 - 不希望暴露聚合对象的内部实现(如数组、链表等)
  3. 多种遍历方式 - 一个聚合对象需要支持多种遍历方式(如正序、倒序、过滤遍历)
  4. 统一遍历接口 - 对不同类型的聚合对象(如数组、链表、哈希表)提供统一的遍历接口
  5. 迭代中操作安全 - 需要在遍历过程中安全地添加 / 删除元素(如 Java 迭代器的remove()方法)

迭代器模式的优缺点

优点

  • 解耦遍历与聚合 - 遍历逻辑与聚合对象分离,各自可独立变化
  • 统一遍历接口 - 不同聚合对象可以通过相同的迭代器接口遍历
  • 支持多种遍历方式 - 一个聚合对象可以有多个迭代器实现不同的遍历逻辑
  • 简化客户端代码 - 客户端无需了解聚合对象的内部结构即可遍历
  • 符合单一职责原则 - 聚合对象负责存储数据,迭代器负责遍历数据

缺点

  • 类数量增加 - 每个聚合对象可能需要对应一个迭代器,增加系统复杂度
  • 遍历效率问题 - 某些迭代器(如链表的随机访问迭代器)可能效率较低
  • 迭代器状态依赖 - 迭代器依赖聚合对象的状态,聚合对象修改可能导致迭代器失效
  • 双向迭代复杂 - 实现双向迭代器(支持previous())会增加设计难度

迭代器模式的扩展

  1. 双向迭代器(Bidirectional Iterator) - 支持向前和向后遍历(如ListIterator):

    interface BidirectionalIterator extends Iterator {boolean hasPrevious();Object previous();
    }
    
  2. 跳跃迭代器(Jump Iterator) - 支持跳过部分元素(如间隔 n 个元素遍历):

    interface JumpIterator extends Iterator {Object jump(int steps);  // 跳过steps个元素
    }
    
  3. 过滤迭代器(Filter Iterator) - 只遍历符合条件的元素:

    class FilterIterator implements Iterator {private final Iterator iterator;private final Predicate filter;  // 过滤条件// 实现略...
    }
    

使用迭代器模式的注意事项

  1. 迭代器的线程安全 - 多线程环境下,迭代器需要考虑线程安全(如使用同步或并发迭代器)
  2. 避免迭代中修改聚合对象 - 多数迭代器不支持遍历中修改聚合对象(会抛出ConcurrentModificationException
  3. 合理设计迭代器生命周期 - 迭代器应与聚合对象的生命周期匹配,避免无效引用
  4. 优先使用内置迭代器 - Java 集合框架已实现完善的迭代器,无需重复造轮子
  5. 结合 foreach 循环 - Java 5 + 的增强 for 循环(foreach)本质上是迭代器的语法糖,可简化代码

总结

迭代器模式通过分离聚合对象的存储逻辑和遍历逻辑,实现了代码的解耦和复用。它在 Java 集合框架中应用广泛,是处理集合遍历的标准方式。合理使用迭代器模式可以简化客户端代码,隐藏聚合对象的内部结构,并支持灵活的遍历方式。在实际开发中,除非需要自定义聚合结构或特殊遍历逻辑,否则优先使用 Java 内置的Iterator接口及其实现。


文章转载自:
http://aerator.wjrtg.cn
http://cabasset.wjrtg.cn
http://ampholyte.wjrtg.cn
http://amphibolic.wjrtg.cn
http://backspin.wjrtg.cn
http://armyman.wjrtg.cn
http://bottlekhana.wjrtg.cn
http://awanting.wjrtg.cn
http://asterid.wjrtg.cn
http://arrowroot.wjrtg.cn
http://ayuntamiento.wjrtg.cn
http://biomathematics.wjrtg.cn
http://alabastrine.wjrtg.cn
http://block.wjrtg.cn
http://agreed.wjrtg.cn
http://aseity.wjrtg.cn
http://berry.wjrtg.cn
http://bitterroot.wjrtg.cn
http://bulge.wjrtg.cn
http://acetaldehyde.wjrtg.cn
http://chorioallantois.wjrtg.cn
http://affinity.wjrtg.cn
http://blustery.wjrtg.cn
http://amfortas.wjrtg.cn
http://belleek.wjrtg.cn
http://acanthocephalan.wjrtg.cn
http://chateaux.wjrtg.cn
http://cardiopathy.wjrtg.cn
http://chromaticism.wjrtg.cn
http://barratry.wjrtg.cn
http://www.dtcms.com/a/280715.html

相关文章:

  • Linux、Ubuntu和CentOS的关系与区别
  • 设计模式笔记_结构型_适配器模式
  • 3.正则化——新闻分类
  • 生产问题排查-数据库连接池耗尽
  • 牛客:HJ23 删除字符串中出现次数最少的字符[华为机考][字符串]
  • Linux 环境下安装 Node.js v16.13.0 完整指南
  • MongoDB 数据库 启用访问控制
  • Volta现代化的 Node.js 版本管理工具
  • CSRF 攻击原理与实验测试(附可运行测试案例)
  • NineData 社区版 V4.3.0 正式发布!新增 5 条迁移对比链路,全面支持 MariaDB、GaussDB 等数据库
  • [附源码+数据库+毕业论文]基于Spring+MyBatis+MySQL+Maven+vue实现的酒店预订管理系统,推荐!
  • Gitlab跑CICD的时候,maven镜像和pom.xml使用的maven版本冲突导致没办法build成功的解决方法
  • [附源码+数据库+毕业论文+开题报告]基于Spring+MyBatis+MySQL+Maven+jsp实现的车辆运输管理系统,推荐!
  • 2025-7-15-C++ 学习 排序(4)
  • langchain教程10:LCEL
  • 【c++】c++11新特性(右值引用和移动语义)
  • PySpark 常用算子详解
  • 【BUG处理】构建APK时遇到错误:‘flutter‘ 命令未被识别。这通常表示您的系统中未安装Flutter SDK或环境变量配置不正确。
  • 牛客:HJ20 密码验证合格程序[华为机考][字符串]
  • 【源力觉醒 创作者计划】文心4.5 vs DeepSeek vs Qwen 3.0:三大能力硬核实测!谁才是王者?
  • 纸板加工制造学习1
  • CF37E Trial for Chief 题解
  • 青年科学基金项目答辩PPT模板 | 杰青优青ppt设计制作美化 | WordinPPT
  • uni-app 学习笔记:Vuex 持久化数据
  • 【C++】神奇的AVL树
  • Java单元测试JUnit
  • 使用 Java 获取 PDF 页面信息(页数、尺寸、旋转角度、方向、标签与边框)
  • 已知均数与标准差,如何生成一组正态分布数据?
  • EPLAN 电气制图(九):直流电源绘制+端子排绘制
  • 线程(二) linux 互斥