news 2026/5/1 7:14:02

设计模式学习(18) 23-16 迭代器模式

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
设计模式学习(18) 23-16 迭代器模式

文章目录

  • 0.个人感悟
  • 1. 概念
  • 2. 适配场景
    • 2.1 适合的场景
    • 2.2 常见场景举例
  • 3. 实现方法
    • 3.1 实现思路
    • 3.2 UML类图
    • 3.3 代码示例
      • 3.3.1 类图
      • 3.3.2 代码跟踪
  • 4. 优缺点
    • 4.1 优点
    • 4.2 缺点

0.个人感悟

  • 迭代器我们并不陌生,java集合操作我们经常使用,只是有for-each、lambda语法糖后我们很少直接使用迭代器,从而忽略其中的原理和思想
  • 迭代器模式很能体现解耦的一些思路:职责分离,聚合的数据和迭代操作分离;面向接口,聚合、迭代器都定义成接口;封装,只关注统一访问,不关注内部实现
  • java集合是经典的设计,大家感兴趣可以了解下。我也计划后面专门总结jdk代码实现

1. 概念

英文定义(《设计模式:可复用面向对象软件的基础》)

Provide a way to access the elements of an aggregate object sequentially without exposing its underlying representation.

中文翻译

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

理解

  • 分离了集合对象的遍历行为,抽象出一个迭代器来负责遍历
  • 简化了聚合对象的接口,客户端只需要知道迭代器接口
  • 可以在不修改聚合对象的前提下,增加新的遍历方式
  • 为不同的聚合结构提供统一的遍历接口

2. 适配场景

2.1 适合的场景

  1. 遍历复杂数据结构:需要遍历复杂聚合对象,且不希望暴露其内部结构
  2. 统一遍历接口:为不同的聚合结构提供统一的遍历方式
  3. 支持多种遍历方式:聚合对象需要支持多种遍历方式(正序、逆序、按条件过滤等)

2.2 常见场景举例

  1. Java集合框架:List、Set、Map等集合的迭代器
  2. 数据库查询结果集:遍历数据库查询返回的多条记录
  3. 文件系统遍历:遍历目录树中的文件
  4. 社交网络关系遍历:遍历用户的好友、关注者等关系
  5. 菜单系统:遍历餐厅菜单中的菜品项
  6. XML/JSON解析:遍历解析树中的节点

3. 实现方法

3.1 实现思路

  1. 定义迭代器接口:声明遍历集合元素所需的方法,如hasNext()next()
  2. 实现具体迭代器:为特定聚合对象实现具体的迭代器,管理遍历过程中的当前位置
  3. 定义聚合接口:声明创建迭代器对象的方法,通常为iterator()createIterator()
  4. 实现具体聚合类:实现聚合接口,返回与自身对应的具体迭代器实例,通常持有集合
  5. 客户端使用迭代器:客户端通过迭代器接口遍历聚合对象,不直接操作聚合内部结构

3.2 UML类图


角色说明:

  • Iterator(迭代器接口):定义访问和遍历元素的接口
  • ConcreteIterator(具体迭代器):实现迭代器接口,记录遍历中的当前位置
  • Aggregate(聚合接口):定义创建迭代器对象的接口
  • ConcreteAggregate(具体聚合):实现聚合接口,返回具体迭代器的实例

3.3 代码示例

珠玉在前,就来看看ArraayList的相关实现

3.3.1 类图

跟踪代码,不然发现,类图:

3.3.2 代码跟踪

迭代器接口: 定义了标准的迭代器操作

publicinterfaceIterator<E>{booleanhasNext();Enext();defaultvoidremove(){thrownewUnsupportedOperationException("remove");}}

聚合接口:

publicinterfaceIterable<T>{Iterator<T>iterator();}

具体聚合和具体迭代器:ArrayList:实现,我们知道它的底层是Object[]; 具体迭代器是一个内部类Itr 。简化版代码如下

publicclassArrayList<E>implementsIterable<E>{// object数组privateObject[]elementData;privateintsize;// ... ArrayList的其他方法// 实现Iterable接口,返回迭代器@OverridepublicIterator<E>iterator(){returnnewItr();}// 具体迭代器(内部类)privateclassItrimplementsIterator<E>{intcursor;// 下一个元素的索引intlastRet=-1;// 上一个返回元素的索引Itr(){}@OverridepublicbooleanhasNext(){returncursor!=size;}@SuppressWarnings("unchecked")@OverridepublicEnext(){if(cursor>=size)thrownewNoSuchElementException();Object[]elementData=ArrayList.this.elementData;EnextElement=(E)elementData[cursor];lastRet=cursor;cursor++;returnnextElement;}@Overridepublicvoidremove(){if(lastRet<0)thrownewIllegalStateException();ArrayList.this.remove(lastRet);cursor=lastRet;lastRet=-1;}}}

客户端使用:

publicclassClient{staticvoidmain(){// mainList<String>list=newArrayList<>();list.add("1");list.add("2");list.add("3");Iterator<String>iterator=list.iterator();while(iterator.hasNext()){System.out.println(iterator.next());}}}

4. 优缺点

4.1 优点

  1. 符合单一职责原则:将遍历行为从聚合对象中分离,使聚合对象只关注数据存储
  2. 符合开闭原则:可以增加新的聚合类和迭代器类而无需修改现有代码
  3. 支持并行遍历:可以在同一个聚合对象上同时进行多个遍历
  4. 简化客户端代码:客户端使用统一的接口遍历不同的聚合结构
  5. 提高复用性:迭代器可以在多个地方复用,不需要重复编写遍历代码

4.2 缺点

  1. 增加系统复杂性:对于简单集合,直接遍历可能更简单
  2. 可能降低性能:迭代器需要维护遍历状态,比直接索引访问稍慢
  3. 访问限制:迭代器通常只提供顺序访问,不支持随机访问
  4. 并发修改问题:在迭代过程中修改集合可能导致异常

参考:

  • 韩顺平 Java设计模式
  • 五月的仓颉 Java设计模式8:迭代器模式
  • kosamino 设计模式之迭代器模式(Iterator)详解及代码示例
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 6:09:34

ai做PPT正确打开方式:选对工具+用对方法,3分钟搞定专业演示

市面上现在也是涌现出太多AIPPT产品&#xff0c;大家往往陷入选择困难&#xff0c;究竟哪款真正适配需求&#xff1f;本文选取了3款AI PPT工具进行讲解。1、AI PPT国内主流的AI演示文稿工具&#xff0c;提供“主题生成、文档导入、PPT美化”三种核心模式&#xff0c;支持标题和…

作者头像 李华
网站建设 2026/5/1 6:10:20

【使用MQTT】

下载EMQX https://docs.emqx.com/zh/emqx/v5.3/deploy/install-windows.html 安装桌面版的MQTT https://mqttx.app/zh/downloads

作者头像 李华
网站建设 2026/5/1 6:09:42

【github】学生认证Azure免费云服务器

文章目录概述配置安装ssh连接修改root密码问题虚拟机创建后磁盘选择免费盘概述 前提&#xff1a;已经github认证大学生并领取大礼包绑定Azure 学生免费资源全览&#xff1a;https://portal.azure.com/#view/Microsoft_Azure_Billing/FreeServicesBlade 文字版参考&#xff1a;…

作者头像 李华
网站建设 2026/5/1 6:09:54

导师严选8个AI论文工具,助你轻松搞定本科生论文!

导师严选8个AI论文工具&#xff0c;助你轻松搞定本科生论文&#xff01; AI 工具如何改变论文写作的未来 在当今这个信息爆炸的时代&#xff0c;本科生面对的学术任务越来越繁重&#xff0c;尤其是在撰写论文的过程中&#xff0c;从选题、资料收集到内容撰写、格式调整&#xf…

作者头像 李华
网站建设 2026/5/1 1:41:08

专著参编证明怎么开?

专著参编证明怎么开&#xff1f;专著主编、副主编的参编证明模版是怎样的&#xff1f;下面淘淘学术来给大家讲解这个疑问。一、什么情况下需要提供参编证明在评职称的时候&#xff0c;如果出版了专著&#xff0c;那么一般会要求提供相关的证明材料。1如果是独著或者合著的专著&…

作者头像 李华
网站建设 2026/4/19 16:44:39

专著和著作的区别有哪些?

专著和著作的区别有哪些&#xff1f;专著和著作是一回事吗&#xff1f;下面淘淘学术来回答作者的这个疑问。一、专著和著作的定义著作独立的完整性的作品&#xff0c;称之为著作。著作包括&#xff1a;1文字作品&#xff1a;比如小说、散文、随笔、回忆录、人物传记、剧本、学术…

作者头像 李华