【设计模式】迭代器模式(Iterator)详解

文章目录

    • 1. 引言:为什么我们每天都在用迭代器?
    • 2. 什么是迭代器模式
      • GoF 定义
    • 3. 迭代器模式的核心思想
    • 4. 迭代器模式的结构
    • 5. 示例:自定义集合 + 迭代器
      • 5.1 迭代器接口
      • 5.2 聚合接口
      • 5.3 具体聚合类
      • 5.4 客户端使用
    • 6. 迭代器模式的优点
    • 7. 迭代器模式的缺点
    • 8. 内部迭代 vs 外部迭代
      • 外部迭代(传统 Iterator)
      • 内部迭代(Stream)
    • 9. JDK 中的迭代器模式
      • Iterator 接口
    • 10. 适用场景
    • 11. 一个常见误区
    • 12. 迭代器 vs 访问者
    • 参考

1. 引言:为什么我们每天都在用迭代器?

你在 Java 中几乎每天都会写:

for(Strings:list){System.out.println(s);}

或者:

Iterator<String>it=list.iterator();while(it.hasNext()){System.out.println(it.next());}

但你是否想过:

  • ArrayListHashSet底层结构完全不同
  • 为什么遍历方式却是统一的?

答案就是:迭代器模式

在不暴露集合内部结构的前提下,顺序访问集合元素


2. 什么是迭代器模式

GoF 定义

提供一种方法顺序访问一个聚合对象中的各个元素,而不暴露其内部表示。

详细解释:迭代器模式提供一个对象来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示。

一句话理解:

遍历与集合实现解耦。


3. 迭代器模式的核心思想

迭代器模式解决了三个问题:

  1. 如何遍历集合
  2. 不暴露集合内部结构
  3. 提供统一遍历接口

集合负责存储,迭代器负责遍历。


4. 迭代器模式的结构

迭代器模式包含四个角色:

  1. Iterator(迭代器接口)

定义访问和遍历聚合元素的接口,通常包含 hasNext()、next() 等方法。

  1. ConcreteIterator(具体迭代器)

实现抽象迭代器接口中所定义的方法,完成对聚合对象的遍历,记录遍历的当前位置。

  1. Aggregate(聚合接口)

定义存储、添加、删除聚合元素以及创建迭代器对象的接口。

  1. ConcreteAggregate(具体聚合)

实现抽象聚合类,返回一个具体迭代器的实例。


5. 示例:自定义集合 + 迭代器

5.1 迭代器接口

publicinterfaceIterator<E>{booleanhasNext();Enext();}

5.2 聚合接口

publicinterfaceContainer<E>{Iterator<E>iterator();}

5.3 具体聚合类

publicclassNameRepositoryimplementsContainer<String>{privateString[]names={"Alice","Bob","Charlie"};@OverridepublicIterator<String>iterator(){returnnewNameIterator();}privateclassNameIteratorimplementsIterator<String>{privateintindex;@OverridepublicbooleanhasNext(){returnindex<names.length;}@OverridepublicStringnext(){returnnames[index++];}}}

5.4 客户端使用

NameRepositoryrepo=newNameRepository();Iterator<String>it=repo.iterator();while(it.hasNext()){System.out.println(it.next());}

6. 迭代器模式的优点

  1. 隐藏集合内部结构
  2. 遍历方式统一
  3. 支持多种遍历策略
  4. 符合单一职责原则

7. 迭代器模式的缺点

  1. 增加类数量
  2. 对简单集合可能显得冗余

8. 内部迭代 vs 外部迭代

外部迭代(传统 Iterator)

while(it.hasNext()){process(it.next());}

内部迭代(Stream)

list.stream().forEach(this::process);

对比:

方式控制权
外部迭代调用者
内部迭代集合

9. JDK 中的迭代器模式

Iterator 接口

publicinterfaceIterator<E>{booleanhasNext();Enext();}
  • ArrayList
  • HashSet
  • LinkedList

都通过 Iterator 统一遍历。


10. 适用场景

  • 不同集合统一遍历
  • 隐藏复杂数据结构
  • 提供多种遍历策略

11. 一个常见误区

迭代器模式不是 for 循环的替代,而是“遍历规则的抽象”。


12. 迭代器 vs 访问者

模式关注点
迭代器如何遍历
访问者如何操作

参考

迭代器模式 | 菜鸟教程

《图解设计模式》

迭代器 - Java教程 - 廖雪峰的官方网站

迭代器设计模式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1173652.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【潮流计算】分布式电源接入电力系统的潮流计算与分析【含Matlab源码 14972期】

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;Matlab领域博客之家&#x1f49e;&…

包装机品牌新排行:2026年哪些品牌值得选择?摇臂缠膜机/自动缠绕机/托盘打包机/自走缠绕包装机,包装机供应商推荐 - 品牌推荐师

随着全球制造业向智能化、柔性化加速转型,包装机作为生产环节的关键设备,其技术迭代与市场需求呈现双向驱动。据行业数据显示,2025年全球包装机械市场规模突破680亿美元,其中自动化、模块化设备占比超65%,食品、医…

Shell Daily 2026-01-17: 任务挂起 (Job Control)

Shell Daily 2026-01-17: 任务挂起 (Job Control) 作为一名 Linux 用户,你是否经历过这种尴尬:正在 Vim 里编辑复杂的配置文件,突然需要去查看一下网络接口的 IP,或者去另一个目录确认文件名。 此时你会怎么做?保…

2026气动蝶阀怎么挑?行业实力厂家来助阵,电液动盲板阀/电动阀门/水利阀门/气动调节阀/不锈钢阀门,蝶阀销售厂家如何选 - 品牌推荐师

在工业自动化与绿色制造加速融合的背景下,气动蝶阀作为流体控制领域的核心设备,其性能稳定性、智能化水平及适配场景的广度,直接影响着能源、化工、冶金等行业的生产效率与安全。据统计,2025年全球气动蝶阀市场规模…

2026年最新有名的金蝶ERP产品价格推荐,协同云/好会计/用友 T3/好业财/好生意/财务云,金蝶ERP企业哪个好 - 品牌推荐师

在数字化转型浪潮持续深入的当下,企业资源计划(ERP)系统已成为企业提升运营效率、实现精细化管理不可或缺的核心工具。面对市场上琳琅满目的ERP产品,如何选择一款既符合自身业务需求,又具备良好性价比与持续服务能…

山东地区GEO推广在家居行业应用哪家好,答案在这里 - 工业品牌热点

本榜单依托全维度市场调研与真实行业口碑,深度筛选出五家GEO推广标杆企业,为家居企业选型提供客观依据,助力精准匹配适配的服务伙伴。 TOP1 推荐:山东学多多智能科技有限公司 推荐指数:★★★★★ | 口碑评分:国…

Java在线客服系统源码 企业网站客服聊天源码 网页客服源码 开发环境:Java + Spri...

Java在线客服系统源码 企业网站客服聊天源码 网页客服源码开发环境&#xff1a;Java Spring boot mysql 通信技术&#xff1a;netty框架后台管理首页-工作绩效&#xff08;会话、邀请、拒绝、已接待、平均会话时长&#xff09;统计首页-在线客服业务概况&#xff08;访客&am…

【图像隐藏】光学衍射神经网络多图像加密和隐藏【含Matlab源码 14970期】

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;Matlab武动乾坤博客之家&#x1f49e;…

英语雅思留学培训机构哪家靠谱?2026 全国雅思课程教育机构口碑排名 + 深度测评​ - 老周说教育

雅思备考痛点直击!在竞争激烈的留学赛道上,雅思成绩已成为海外名校的核心 “敲门砖”,但不少考生却陷入多重备考困境:面对市场上千余家培训机构的花式宣传,课程体系同质化严重,让人陷入选课迷茫;投入大量时间精…

【图像隐写】小波变换算法的隐写术的信息安全【含Matlab源码 14971期】

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;Matlab武动乾坤博客之家&#x1f49e;…

2026河北保定农村自建房避坑指南:5个省钱关键点,少花10万不踩雷 - 苏木2025

引言: 在“保卫大都,安定天下”的河北保定,无论是雄县、容城的平原沃野,还是涞源、阜平的山地丘陵,亦或是易县、唐县的人文古镇,农村自建房都是家家户户的头等大事。作为京津冀地区中心城市,保定兼具山区和平原…

Flask模型部署提速实战

&#x1f493; 博客主页&#xff1a;借口的CSDN主页 ⏩ 文章专栏&#xff1a;《热点资讯》 Flask模型部署提速实战&#xff1a;从瓶颈到高效流水线目录Flask模型部署提速实战&#xff1a;从瓶颈到高效流水线 引言 问题分析&#xff1a;Flask部署的深层瓶颈 解决方案&#xff1a…

云服务器如何开放安全组?

先说说为什么要开放安全组&#xff0c;这个东西类似于防火墙&#xff0c;如果你不开放mysql3306、redis6379等端口访问权限&#xff0c;那么你是无法连接到云服务器上mysql、redis等服务的&#xff0c;所以购买云服务器并安全完一系列中间件后&#xff0c;必须开放相关端口的安…

【图像加密解密】正弦 余弦混沌映射生成随机序列图像RGB三通道分别执行 “行移位-列移位-XOR 异或” 操作图像加密解密【含Matlab源码 14968期】

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;Matlab武动乾坤博客之家&#x1f49e;…

【图像加密】基于matlab相位截断傅立叶变换的图像加密解密【含Matlab源码 14969期】

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到海神之光博客之家&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49…

【图像加密】相位截断傅立叶变换的图像加密解密【含Matlab源码 14969期】

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;Matlab武动乾坤博客之家&#x1f49e;…

【图像隐藏】基于matlab光学衍射神经网络多图像加密和隐藏【含Matlab源码 14970期】

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到海神之光博客之家&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49…

【图像隐写】基于matlab小波变换算法的隐写术的信息安全【含Matlab源码 14971期】

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到海神之光博客之家&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49…

洛谷 P1219:[USACO1.5] 八皇后 Checker Challenge ← DFS

​【题目来源】https://www.luogu.com.cn/problem/P1219【题目描述】一个如下的 66 的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行、每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子…

【潮流计算】基于matlab分布式电源接入电力系统的潮流计算与分析【含Matlab源码 14972期】

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到海神之光博客之家&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49…