news 2026/3/31 14:18:49

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【设计模式】迭代器模式(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教程 - 廖雪峰的官方网站

迭代器设计模式

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/31 6:25:57

三菱PLC玩转压力控制:压背光板项目实战揭秘

三菱Q系列PLC程序案例 本案例是压背光板并保持恒定压力&#xff0c;通过位置模式以及转矩模式切换来快速实现压力保持&#xff0c;转矩模式时通过PID计算来自动调节压力。 本案例采用三菱Q系列PLC以及QD77MS运动模块以及三菱J4-B型总线伺服系统。 三菱Q系列ST、结构化编程、QD7…

作者头像 李华
网站建设 2026/3/26 22:29:36

京东m端 验证码分析

声明 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01;部分Python代码cookies.update(dict(res…

作者头像 李华
网站建设 2026/3/27 18:01:35

学术航行新伙伴:书匠策AI——本科论文写作的“全能舵手”

在本科学习的最后阶段&#xff0c;论文写作就像一场充满挑战的航行。选题像是在茫茫大海中寻找方向&#xff0c;文献梳理如同收集航海图&#xff0c;逻辑构建好比搭建船只骨架&#xff0c;语言表达则是扬起的风帆&#xff0c;而格式调整就是确保航行合规的规则。许多学子在这场…

作者头像 李华