news 2026/2/10 12:19:09

设计模式学习(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/2/8 21:57:01

从分布式架构到提示工程,我的知识体系重构之路(全程记录)

从分布式到提示工程&#xff1a;一名后端工程师的知识体系重构全记录 标题选项 《从分布式架构到提示工程&#xff1a;我的300天知识体系迭代之路》《重构认知&#xff1a;一名后端工程师跨越技术边界的AI转型笔记》《从“分而治之”到“Prompt引导”&#xff1a;我如何把分布式…

作者头像 李华
网站建设 2026/2/7 14:01:18

【收藏级干货】构建企业级客服Agent的5大核心设计原则与落地架构

【收藏级干货】玄姐亲授&#xff1a;构建企业级客服Agent的5大核心设计原则与落地架构 本文阐述了客服Agent系统设计的核心理念与方法&#xff0c;强调其本质是自动化业务执行系统而非聊天机器人。文章详细介绍了风险分层架构设计、三层状态管理模型、模糊意图处理策略及工程化…

作者头像 李华
网站建设 2026/2/8 16:37:51

收藏必备!大模型知识蒸馏技术调研:黑盒、白盒与混合方法全解析

文章调研了大模型知识蒸馏近年工作&#xff0c;分为黑盒和白盒两种类型。黑盒蒸馏在工业界应用更广&#xff0c;白盒蒸馏在学术界研究较多。文章介绍了代表性文献&#xff0c;包括DeepSeek-R1、MiniPLM等黑盒方法&#xff0c;以及DistilQwen2.5等黑白盒结合方法&#xff0c;并讨…

作者头像 李华
网站建设 2026/2/8 3:36:04

如何搭建一个GPU训练集群——把手教你从零开始

大家好&#xff0c;我是V哥。 话说AI运维工程师的成长路径&#xff0c;GPU集群到底怎么搭&#xff1f;公司让我搞这个&#xff0c;我连从哪下手都不知道啊&#xff01; 行&#xff0c;今天V哥就把这事儿给你掰开了、揉碎了讲清楚。不整那些高大上的概念轰炸&#xff0c;就用大白…

作者头像 李华
网站建设 2026/2/8 17:17:14

文本补全软件 espanso 配置某个应用单独使用某个补全

espanso 官网&#xff1a;https://espanso.org/ &#xff08;1&#xff09; config是配置文件目录 match是放补全规则的地方 &#xff08;2&#xff09; 先在match文件夹建补全规则 注意文件名以下划线开头&#xff0c;代表这个文件默认不生效 matches:- trigger: "s…

作者头像 李华
网站建设 2026/2/8 0:29:07

基于AI的政府审计监管系统对比:哪家更值得信赖?

基于AI的政府审计监管系统对比&#xff1a;哪家更值得信赖&#xff1f;在数字化转型的浪潮中&#xff0c;政府审计监管系统正逐渐引入人工智能技术&#xff0c;以提升审计效率和准确性。本文将对市场上主流的基于AI的政府审计监管系统进行对比分析&#xff0c;帮助读者了解各家…

作者头像 李华