news 2026/3/24 2:05:06

设计模式——迭代器模式

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
设计模式——迭代器模式

迭代器模式 (Iterator Pattern)

什么是迭代器模式?

迭代器模式是一种行为型设计模式,它允许你遍历集合对象中的元素,而不暴露集合的内部表示

简单来说:迭代器模式就是提供一个统一的接口来遍历不同的集合。

生活中的例子

想象一下:

  • 电视遥控器:上一个频道、下一个频道
  • 音乐播放器:上一首、下一首
  • 翻书:上一页、下一页

为什么需要迭代器模式?

传统方式的问题

// 客户端需要了解集合的内部结构for(inti=0;i<list.size();i++){System.out.println(list.get(i));}

问题

  1. 暴露内部:暴露了集合的内部结构
  2. 不统一:不同集合的遍历方式不同
  3. 难以扩展:新增集合类型需要修改客户端

迭代器模式的优势

// 使用迭代器Iteratoriterator=collection.iterator();while(iterator.hasNext()){System.out.println(iterator.next());}

优势

  1. 统一接口:提供统一的遍历接口
  2. 隐藏内部:隐藏集合的内部结构
  3. 易于扩展:新增集合类型很容易

迭代器模式的结构

┌─────────────────────┐ │ Iterator │ 迭代器接口 ├─────────────────────┤ │ + hasNext(): boolean│ │ + next(): Object │ └──────────┬──────────┘ │ 实现 │ ┌──────────┴──────────┐ │ ConcreteIterator │ 具体迭代器 ├─────────────────────┤ │ - index: int │ │ - collection: Col │ │ + hasNext(): boolean│ │ + next(): Object │ └─────────────────────┘ ┌─────────────────────┐ │ Iterable │ 可迭代接口 ├─────────────────────┤ │ + iterator(): Iter │ └──────────┬──────────┘ │ 实现 │ ┌──────────┴──────────┐ │ ConcreteCollection │ 具体集合 ├─────────────────────┤ │ - elements: List │ │ + iterator(): Iter │ └─────────────────────┘

代码示例

1. 定义迭代器接口

/** * 迭代器接口 */publicinterfaceIterator{/** * 是否有下一个元素 */booleanhasNext();/** * 获取下一个元素 */Objectnext();}

2. 定义可迭代接口

/** * 可迭代接口 */publicinterfaceIterable{/** * 获取迭代器 */Iteratoriterator();}

3. 定义具体迭代器

/** * 具体迭代器 */publicclassConcreteIteratorimplementsIterator{privateList<Object>elements;privateintindex=0;publicConcreteIterator(List<Object>elements){this.elements=elements;}@OverridepublicbooleanhasNext(){returnindex<elements.size();}@OverridepublicObjectnext(){if(hasNext()){returnelements.get(index++);}returnnull;}}

4. 定义具体集合

/** * 具体集合 */publicclassConcreteCollectionimplementsIterable{privateList<Object>elements=newArrayList<>();publicvoidadd(Objectelement){elements.add(element);}@OverridepublicIteratoriterator(){returnnewConcreteIterator(elements);}}

5. 使用迭代器

/** * 迭代器模式测试类 * 演示如何使用迭代器模式遍历集合 */publicclassIteratorTest{publicstaticvoidmain(String[]args){System.out.println("=== 迭代器模式测试 ===\n");// 创建集合ConcreteCollectioncollection=newConcreteCollection();collection.add("元素1");collection.add("元素2");collection.add("元素3");collection.add("元素4");collection.add("元素5");// 使用迭代器遍历System.out.println("--- 使用迭代器遍历 ---");Iteratoriterator=collection.iterator();while(iterator.hasNext()){System.out.println(iterator.next());}System.out.println("\n=== 迭代器模式的优势 ===");System.out.println("1. 统一接口:提供统一的遍历接口");System.out.println("2. 隐藏内部:隐藏集合的内部结构");System.out.println("3. 易于扩展:新增集合类型很容易");System.out.println("4. 简化客户端:简化客户端代码");System.out.println("\n=== 实际应用场景 ===");System.out.println("1. 集合框架:Java集合框架");System.out.println("2. 数据库查询:数据库结果集");System.out.println("3. 文件遍历:文件系统遍历");System.out.println("4. 树形结构:树形结构遍历");System.out.println("\n=== Java中的迭代器 ===");System.out.println("Java中的集合框架都实现了Iterable接口:");System.out.println("- List: ArrayList, LinkedList");System.out.println("- Set: HashSet, TreeSet");System.out.println("- Map: HashMap, TreeMap (通过entrySet())");System.out.println("\n使用for-each循环:");System.out.println("for (Object element : collection) {");System.out.println(" System.out.println(element);");System.out.println("}");}}

迭代器模式的优点

  1. 统一接口:提供统一的遍历接口
  2. 隐藏内部:隐藏集合的内部结构
  3. 易于扩展:新增集合类型很容易
  4. 简化客户端:简化客户端代码

迭代器模式的缺点

  1. 增加复杂度:引入了额外的类
  2. 性能开销:多了一层调用

适用场景

  1. 遍历集合:需要遍历集合对象
  2. 统一接口:需要统一的遍历接口
  3. 隐藏内部:需要隐藏集合的内部结构

常见应用场景

  • 集合框架:Java集合框架
  • 数据库查询:数据库结果集
  • 文件遍历:文件系统遍历

使用建议

  • 遍历集合:使用迭代器模式
  • 统一接口:使用迭代器模式
  • 简单遍历:直接使用for循环即可

注意事项

⚠️ 迭代器模式虽然有用,但要注意:

  • 考虑使用for-each循环
  • 注意并发修改问题
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/15 23:53:23

经方药食两用服务平台信息管理系统源码-SpringBoot后端+Vue前端+MySQL【可直接运行】

摘要 随着中医药文化的普及和健康管理意识的提升&#xff0c;经方药食两用服务逐渐成为人们关注的焦点。传统的中医药服务模式存在信息分散、管理效率低、用户体验不佳等问题&#xff0c;亟需通过信息化手段优化服务流程。经方药食两用服务平台信息管理系统的开发旨在整合中医药…

作者头像 李华
网站建设 2026/3/20 10:14:44

Windows热键冲突终极解决方案:3步定位与企业级优化指南

Windows热键冲突终极解决方案&#xff1a;3步定位与企业级优化指南 【免费下载链接】hotkey-detective A small program for investigating stolen hotkeys under Windows 8 项目地址: https://gitcode.com/gh_mirrors/ho/hotkey-detective 在Windows系统日常操作中&…

作者头像 李华
网站建设 2026/3/15 10:18:37

ccmusic-database数字音乐发行:独立音乐人上传作品自动获取流派标签

ccmusic-database数字音乐发行&#xff1a;独立音乐人上传作品自动获取流派标签 你是不是也遇到过这样的问题&#xff1a;辛辛苦苦做完一首原创曲子&#xff0c;上传到平台时却卡在“选择流派”这一步&#xff1f;选“独立流行”&#xff0c;怕不够准确&#xff1b;选“另类摇…

作者头像 李华
网站建设 2026/3/13 7:53:17

PDF解析神器QAnything:5步完成文档转换与表格识别

PDF解析神器QAnything&#xff1a;5步完成文档转换与表格识别 1. 为什么PDF解析总是让人头疼&#xff1f; 你有没有遇到过这样的场景&#xff1a;手头有一份几十页的PDF制度文件&#xff0c;需要快速提取关键条款、整理成结构化内容&#xff0c;或者把里面的表格数据导入Exce…

作者头像 李华
网站建设 2026/3/14 10:14:08

企业知识管理新选择:GTE-Pro语义引擎深度体验

企业知识管理新选择&#xff1a;GTE-Pro语义引擎深度体验 在企业日常运营中&#xff0c;你是否也遇到过这些场景&#xff1a; 新员工入职后翻遍共享文档&#xff0c;却找不到“差旅报销流程最新版”在哪&#xff1b;客服同事面对“系统登录不了”的工单&#xff0c;要在几十份…

作者头像 李华
网站建设 2026/3/18 8:57:57

[特殊字符] BEYOND REALITY Z-Image: 高精度写实文生图引擎的快速部署指南

&#x1f30c; BEYOND REALITY Z-Image: 高精度写实文生图引擎的快速部署指南 1. 为什么你需要这个模型——写实人像生成的新标准 你是否遇到过这样的困扰&#xff1a;生成的人像皮肤像塑料&#xff0c;光影生硬得像打光板直射&#xff0c;细节模糊得连睫毛都分不清&#xff…

作者头像 李华