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

设计模式——迭代器模式

迭代器模式 (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循环
  • 注意并发修改问题
http://www.jsqmd.com/news/327979/

相关文章:

  • shiro学习要点
  • SpringBoot+Vue 青年公寓服务平台平台完整项目源码+SQL脚本+接口文档【Java Web毕设】
  • OpenClaw:你的个人AI助手,多平台统一控制的革命性方案
  • SpringBoot+Vue 高校教师电子名片系统管理平台源码【适合毕设/课设/学习】Java+MySQL
  • 前后端分离大学生就业需求分析系统系统|SpringBoot+Vue+MyBatis+MySQL完整源码+部署教程
  • MedGemma X-Ray医疗AI落地:符合DICOM基础规范的轻量级方案
  • 经方药食两用服务平台信息管理系统源码-SpringBoot后端+Vue前端+MySQL【可直接运行】
  • GTE+SeqGPT企业应用案例:某IT公司内部技术知识库智能问答系统落地纪实
  • 企业级Spring Boot疗养院管理系统管理系统源码|SpringBoot+Vue+MyBatis架构+MySQL数据库【完整版】
  • 5分钟部署Z-Image-ComfyUI,文生图一键生成超清美图
  • ccmusic-database数字音乐发行:独立音乐人上传作品自动获取流派标签
  • 手把手教你用SiameseUIE搭建智能客服信息抽取系统
  • ChatTTS-究极拟真语音合成实战案例:直播带货话术AI语音实时生成
  • Windows热键冲突终极解决方案:3步定位与企业级优化指南
  • [特殊字符] Nano-Banana效果展示:汽车ECU模块爆炸图生成——高密度部件精准分离
  • DeepSeek-R1-Distill-Qwen-1.5B工具集测评:vLLM/Ollama/Jan效率对比
  • MusePublic艺术创作引擎:5分钟快速生成时尚人像的保姆级教程
  • 人脸识别OOD模型实际作品:质量分分层抽样生成的特征空间分布热力图
  • OpenClaw-AI自动化神器本地部署Clawdbot-macos - fx
  • 医疗风险预测系统:Baichuan-M2-32B与XGBoost的集成建模
  • SeqGPT-560M多场景落地:医疗问诊记录分类、法律合同关键条款抽取
  • StructBERT中文语义系统稳定性测试:7×24小时高并发服务压测报告
  • AI智能文档扫描仪快速上手:无需模型权重的轻量部署教程
  • BGE-M3效果对比:BGE-M3与bge-large-zh-v1.5在专业领域表现
  • GTE-Chinese-Large快速部署:CSDN平台GPU Pod镜像启动时间优化至90秒内
  • Swin2SR交互指南:左侧面板上传与右侧结果查看
  • Unsloth训练监控技巧:实时查看loss与性能指标
  • Swin2SR操作流程:左侧面板上传图片注意事项
  • Ollama部署本地大模型实战案例:用DeepSeek-R1-Distill-Qwen-7B自动生成周报文案
  • ChatGLM3-6B部署案例:高校实验室AI教学平台本地化部署全过程