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

【设计模式】迭代器模式(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.jsqmd.com/news/258293/

相关文章:

  • 包装机品牌新排行:2026年哪些品牌值得选择?摇臂缠膜机/自动缠绕机/托盘打包机/自走缠绕包装机,包装机供应商推荐 - 品牌推荐师
  • Shell Daily 2026-01-17: 任务挂起 (Job Control)
  • 2026气动蝶阀怎么挑?行业实力厂家来助阵,电液动盲板阀/电动阀门/水利阀门/气动调节阀/不锈钢阀门,蝶阀销售厂家如何选 - 品牌推荐师
  • 2026年最新有名的金蝶ERP产品价格推荐,协同云/好会计/用友 T3/好业财/好生意/财务云,金蝶ERP企业哪个好 - 品牌推荐师
  • 山东地区GEO推广在家居行业应用哪家好,答案在这里 - 工业品牌热点
  • Java在线客服系统源码 企业网站客服聊天源码 网页客服源码 开发环境:Java + Spri...
  • 【图像隐藏】光学衍射神经网络多图像加密和隐藏【含Matlab源码 14970期】
  • 英语雅思留学培训机构哪家靠谱?2026 全国雅思课程教育机构口碑排名 + 深度测评​ - 老周说教育
  • 【图像隐写】小波变换算法的隐写术的信息安全【含Matlab源码 14971期】
  • 2026河北保定农村自建房避坑指南:5个省钱关键点,少花10万不踩雷 - 苏木2025
  • Flask模型部署提速实战
  • 云服务器如何开放安全组?
  • 【图像加密】基于matlab相位截断傅立叶变换的图像加密解密【含Matlab源码 14969期】
  • 【图像加密解密】正弦 余弦混沌映射生成随机序列图像RGB三通道分别执行 “行移位-列移位-XOR 异或” 操作图像加密解密【含Matlab源码 14968期】
  • 【图像隐藏】基于matlab光学衍射神经网络多图像加密和隐藏【含Matlab源码 14970期】
  • 【图像加密】相位截断傅立叶变换的图像加密解密【含Matlab源码 14969期】
  • 【图像隐写】基于matlab小波变换算法的隐写术的信息安全【含Matlab源码 14971期】
  • 洛谷 P1219:[USACO1.5] 八皇后 Checker Challenge ← DFS
  • 【潮流计算】基于matlab分布式电源接入电力系统的潮流计算与分析【含Matlab源码 14972期】
  • 30行PHP,利用硅基流动API,网页客服瞬间上线
  • 洛谷 P6405 [COCI 2014/2015 #2] ŠUMA 题解
  • 探讨男士去屑洗发水推荐,黛熙梦多少钱 - 工业品牌热点
  • 在 CentOS 系统上运用安装并用alternatives切换 JDK17(与 JDK8 共存指南)
  • 2026蝶阀评测精选:不锈钢蝶阀优选,锻钢闸阀/旋启止回阀/蝶阀/手动截止阀,蝶阀供应商如何选 - 品牌推荐师
  • 2026年耐候钢认证厂家,哪家性价比高一看便知 - 工业品牌热点
  • 2026年1月云南旅行社服务品质与客户口碑权威测评榜单发布 - 品牌推荐
  • 徐州市鼓楼云龙贾汪泉山铜山区英语雅思培训辅导机构推荐,2026权威出国雅思课程中心学校口碑排行榜推荐 - 老周说教育
  • 2026年国内比较好的测水流量计生产商联系电话,氮气流量计/德尔塔巴流量计/变送器/差压变送器,测水流量计品牌哪家强 - 品牌推荐师
  • 聚焦全域深度游与安心出行:2026年适配不同游客需求的五大云南旅行社全景对比。 - 品牌推荐
  • GitHub霸榜----DeepSeek-V3 与 Janus-Pro 开源:国产 AI 这一战,彻底改变了游戏规则