设计模式学习(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)详解及代码示例

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

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

相关文章

利用大数据技术盘活数据资产

利用大数据技术盘活数据资产 引言 在当今数字化时代,数据已成为企业最为宝贵的资产之一。然而,大量的数据若不能被有效利用,就如同沉睡的宝藏,无法为企业创造价值。大数据技术的出现,为盘活这些数据资产提供了有力的手段。通过大数据技术,企业能够从海量、复杂的数据中…

基于SpringBoot+Vue的宠物医疗管理系统的设计与实现

行业背景 宠物医疗行业近年来快速发展&#xff0c;随着养宠人群扩大和消费升级&#xff0c;专业化、数字化的医疗管理需求显著增长。传统纸质记录和人工管理方式效率低、易出错&#xff0c;难以满足现代宠物诊所的高效运营需求。 技术背景 SpringBootVue的全栈技术组合已成为…

cfmifs.dll文件丢失找不到 免费下载方法分享

在使用电脑系统时经常会出现丢失找不到某些文件的情况&#xff0c;由于很多常用软件都是采用 Microsoft Visual Studio 编写的&#xff0c;所以这类软件的运行需要依赖微软Visual C运行库&#xff0c;比如像 QQ、迅雷、Adobe 软件等等&#xff0c;如果没有安装VC运行库或者安装…

确认关系后,第一件事做什么?——一份给「刚需型」用户的关系启动指南

摘要&#xff1a; 本文不讨论风花雪月&#xff0c;旨在为以长期关系为导向的「刚需型」用户&#xff0c;提供一套严谨、可执行的「关系初始化协议」。跳过此步骤&#xff0c;你的情感项目可能在进入开发阶段前&#xff0c;就因「需求不清」与「架构缺陷」而宣告失败。 一、项目…

cfmifsproxy.dll文件丢失找不到 免费下载方法分享

在使用电脑系统时经常会出现丢失找不到某些文件的情况&#xff0c;由于很多常用软件都是采用 Microsoft Visual Studio 编写的&#xff0c;所以这类软件的运行需要依赖微软Visual C运行库&#xff0c;比如像 QQ、迅雷、Adobe 软件等等&#xff0c;如果没有安装VC运行库或者安装…

学长亲荐9个AI论文网站,本科生毕业论文轻松搞定!

学长亲荐9个AI论文网站&#xff0c;本科生毕业论文轻松搞定&#xff01; AI 工具如何让论文写作变得轻松高效 随着 AI 技术的不断发展&#xff0c;越来越多的学生开始借助 AI 工具来辅助自己的论文写作。尤其是对于本科生来说&#xff0c;面对繁重的论文任务&#xff0c;合理…

亲测好用9个AI论文工具,助本科生轻松写论文!

亲测好用9个AI论文工具&#xff0c;助本科生轻松写论文&#xff01; AI 工具如何让论文写作变得轻松 在当前的学术环境中&#xff0c;越来越多的本科生开始接触并依赖 AI 工具来辅助论文写作。这些工具不仅能够帮助学生快速生成初稿、优化语言表达&#xff0c;还能有效降低 AIG…

亲测好用9个AI论文软件,自考学生轻松搞定毕业论文!

亲测好用9个AI论文软件&#xff0c;自考学生轻松搞定毕业论文&#xff01; AI 工具如何助力自考学生轻松应对论文挑战 在当前的教育环境中&#xff0c;自考学生面临着越来越高的学术要求&#xff0c;尤其是毕业论文的撰写。面对繁重的写作任务和时间压力&#xff0c;许多学生开…

Chakra.dll文件丢失找不到问题 免费下载方法分享

在使用电脑系统时经常会出现丢失找不到某些文件的情况&#xff0c;由于很多常用软件都是采用 Microsoft Visual Studio 编写的&#xff0c;所以这类软件的运行需要依赖微软Visual C运行库&#xff0c;比如像 QQ、迅雷、Adobe 软件等等&#xff0c;如果没有安装VC运行库或者安装…

人体设计提示词

人体设计提示词方案 模板&#xff1a;主题&#xff08;主题定位&#xff09; 人体&#xff08;人体形态&#xff09; 色彩&#xff08;色彩策略&#xff09; 背景&#xff08;背景设计&#xff09; 细节&#xff08;细节增强&#xff09; 参数&#xff08;技术参数&#xff09;…

揭秘!AI应用架构师如何提升家居场景AI识别器功能

家居场景AI识别器进阶指南:从“能用”到“好用”的架构师方法论 标题选项 家居场景AI识别器升级密码:架构师的5步优化心法 从准确率到用户体验:家居AI识别器的架构升级之路 揭秘家居AI识别器功能跃迁:架构师的实践手册 家居场景AI识别器提升全攻略:解决痛点的系统性方法 …

基于yolov8的无人机视角夜间车辆检测识别系统python源码+onnx模型+评估指标曲线+精美GUI界面

【算法介绍】 基于YOLOv8的无人机视角夜间车辆检测识别系统&#xff0c;是专为低空无人机夜间作业场景打造的智能分析平台。该系统以YOLOv8目标检测算法为核心&#xff0c;可高效处理无人机摄像头拍摄的夜间道路影像&#xff0c;精准识别画面中的摩托车&#xff08;motorcycle…

Linux 下驱动的编写与测试

一、驱动编写// kernel_protect.c - 最简版本 #include <linux/module.h> #include <linux/kernel.h> #include <linux/init.h>static int __init protect_init(void) {printk(KERN_INFO "myapp_protect: 模块加载成功\n");return 0; }static void…

基于springboot+vue的传统文化交流交易平台

技术融合推动文化传承 SpringBoot与Vue的结合为传统文化交流交易平台提供了现代化技术支撑。后端SpringBoot的高效开发与稳定性保障系统性能&#xff0c;前端Vue的响应式设计提升用户体验&#xff0c;两者协作实现传统与现代技术的无缝衔接。 拓宽文化传播渠道 平台通过线上…

springboot基于Android的全民健身App设计与实现

背景分析移动互联网的普及和健康意识的提升推动了全民健身需求。传统健身方式受时间、场地限制&#xff0c;而智能手机的高渗透率为健身类App提供了硬件基础。SpringBoot作为轻量级Java框架&#xff0c;能快速构建后端服务&#xff0c;满足高并发、跨平台的健身应用开发需求。社…

2026年浙江洁净车间装修新风系统评测:品牌与效能,无尘室/净化车间/净化工程/净化工程公司/洁净室,洁净车间施工有哪些

在浙江工业制造领域,洁净车间已成为保障产品品质、提升生产效率的核心基础设施。尤其在电子半导体、医疗制药、新能源等高精度行业,车间环境的洁净度、温湿度控制精度直接影响产品良率与合规性。作为长三角洁净工程市…

全网最全本科生必看!8款一键生成论文工具TOP8测评

全网最全本科生必看&#xff01;8款一键生成论文工具TOP8测评 2026年本科生论文写作工具测评&#xff1a;为何需要这份榜单&#xff1f; 在当前学术环境日益复杂的背景下&#xff0c;本科生在撰写论文时面临诸多挑战&#xff0c;如选题思路不清晰、文献资料查找困难、格式规范不…

26年寒假生活指导1.21

GitHub 权限体系与访问令牌管理 🎯 核心认知 GitHub 协作围绕“权限控制”和“安全认证”两大支柱展开: • 权限体系 决定了“谁能做什么” • 访问令牌 是自动化场景下的安全钥匙 第一部分:GitHub 协作权限体系基…

ThinkLink 基于 RPC 的 LoRaWAN 告警通知机制

在大规模物联网系统中&#xff0c;告警能力是保障系统稳定运行的关键组成部分&#xff0c;尤其是在 LoRaWAN 等低功耗广域网络场景下&#xff0c;设备通常分散部署、长期无人值守。ThinkLink 平台基于原生 RPC 机制与触发联动模型&#xff0c;构建了一套灵活、可扩展的告警通知…

2026儿童香氛新风尚:国内娱乐空间热门款评测,蜡烛香氛/香氛设备/助眠香薰/酒店香氛,香氛ODM代工厂排行榜单

在娱乐空间场景化升级浪潮中,儿童香氛作为环境氛围营造的核心载体,正从“功能性辅助”转向“体验感主导”。其不仅能精准适配儿童娱乐场景的嗅觉需求,更通过安全配方与场景化设计,成为提升空间竞争力、增强用户粘性…