【设计模式】行为型设计模式之 迭代器模式

介绍

迭代器模式(Iterator Pattern) 是行为设计模式之一,它提供了一种访问集合对象(如列表、数组或其他集合结构)中元素的方式,而不需要暴露集合的内部结构。迭代器模式定义了一个迭代器接口,该接口负责遍历集合中的元素,这样用户就可以通过迭代器来访问集合的元素,而无需了解集合的具体实现。

一个完整的迭代器模式包含集合和迭代器两部分内容,集合又分为集合接口和实现类、迭代器分为迭代器实现类和接口。

优点

封装性:迭代器将遍历集合的责任封装在迭代器对象中,集合的内部结构对外界是隐藏的。

支持多种遍历:同一个集合可以有多种遍历方式,只需提供不同的迭代器实现即可。

简化集合接口:集合类无需暴露内部结构和遍历算法,使得集合类的设计更加简洁。

迭代期间的修改:某些迭代器设计允许在迭代过程中安全地修改集合,例如Java的Iterator提供了remove()方法。

迭代器遍历集合可能存在的问题

迭代器遍历时删除元素或者增加元素导致不可预期的情况

删除元素:删除了游标及游标前元素,可能导致某个元素遍历不到。删除了游标后的元素则无影响

增加元素:在制定位置添加元素时,如果在游标及游标前增加元素可能导致某个元素被重复遍历,如果在游标后增加元素则不会出现重复遍历的问题。

遍历时遇到集合删除或增加元素的解决方案

程序中不可预期的错误比直接出错更可怕

方案 1 遍历时粗暴地不允许修改集合
方案 2 fast-fail 策略 遍历的过程中一旦发现集合被修改了,则立即抛出异常终止遍历

java 的一些集合就是这么做的,例如 ArrayList、LinkedList、HashSet、HashMap等集合的迭代器。其实现原理就是,在集合中保存一个 modCount 记录集合修改的次数。创建迭代器时会保存当前的修改次数,每次使用迭代器的 hasNext、next、currentItem 等方法时都会检查集合对比迭代器创建时的修改次数是否变化,一旦变化立刻抛出异常。避免产生更大的影响。

方案 3 fail-safe
  • 定义:即使在遍历过程中集合被修改,也不会抛出异常,能够安全地完成遍历过程。这是通过拷贝原集合的数据结构来实现的,因此对原集合的修改不会影响到迭代过程。
  • 实现原理:安全失败的集合通常通过内部维护一个快照或者只读视图来保证迭代过程中数据的一致性,即使原集合发生了改变,迭代器遍历的是快照的数据,因此不会抛出异常。
  • 典型应用 :CopyOnWriteArrayList、CopyOnWriteArraySet、ConcurrentHashMap的迭代器就采用了安全失败机制。这些集合在修改时,会创建一个新的数据结构来保存修改后的数据,原有数据结构保持不变,从而保证了迭代过程的安全性。

Java 的迭代器类的 Remove 方法原理

  1. Java 的迭代器提供了 remove 方法,但是只能删除游标指向的前一个元素
  2. 每次调用完 next 函数后,能且仅能调用一次 remove 方法多次调用则会直接报错。
  3. Java 的迭代器没有添加元素方法,因为迭代器的主要作用是遍历。
  4. 原理:迭代器有一个成员变量 lastRet 记录了游标元素的前一个元素,通过迭代器删除这个元素时会更新迭代器中的游标和 lastRet 值,将 lastRet 向前移动一个元素,同时将游标指向原本的 lastRet 的位置,这样可以
  5. 保证不会因为删除元素导致某个元素遍历不到
相关推荐
weixin_4604435613 分钟前
2026年新修订《网络安全法》实施:Java私有化考试系统如何做好SBOM、漏洞治理与安全升级?
java·开发语言·在线考试系统·企业培训考试系统·宏远培训考试系统·国企培训考试系统·国产化培训系统
海鸥-w3 小时前
什么是AOP
java
Cc.Y4 小时前
Java零基础入门:可变字符串与包装类:StringBuilder、StringBuffer 与 通讯录管理系统实战
java·开发语言·python
paopaokaka_luck4 小时前
基于springboot+vue的智慧家政管理系统(AI问答、 WebSocket实时沟通、ECharts运营分析、订单规则与服务追踪)
java·javascript·spring boot·数据分析·echarts·mybatis
sm_926787054 小时前
RFID 标签打印的技术实现要点与二次开发实践
java·大数据·前端·c++·编辑器
阿森_dev4 小时前
2027 届毕设选题怎么选:30 个 Java 方向选题的实现难度排序
java·开发语言·spring boot·毕业设计·课程设计
Sarvartha4 小时前
Lambda 表达式和函数式接口
java·开发语言
计算机毕业设计杰瑞4 小时前
【计算机毕设精品】基于SpringBoot的一体化教务与学业质量管理系统的设计与实现,附源码_增删改查_java项目_可完美运行部署_网站项目
java·spring boot·课程设计
colinu4 小时前
C++ 异步任务与线程生命周期:`std::async`、`future`、`thread`、`jthread` 与协作式退出
java·jvm·c++
蜗牛互联网5 小时前
Python + JSON Schema 实现工单结构化输出与本地复核
java·人工智能·后端