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

介绍

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

优点

封装性:迭代器将遍历集合的责任封装在迭代器对象中,集合的内部结构对外界是隐藏的。
支持多种遍历:同一个集合可以有多种遍历方式,只需提供不同的迭代器实现即可。
简化集合接口:集合类无需暴露内部结构和遍历算法,使得集合类的设计更加简洁。
迭代期间的修改:某些迭代器设计允许在迭代过程中安全地修改集合,例如Java的Iterator提供了remove()方法。

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

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

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

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

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

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

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

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

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

  1. Java 的迭代器提供了 remove 方法,但是只能删除游标指向的前一个元素
  2. 每次调用完 next 函数后,能且仅能调用一次 remove 方法多次调用则会直接报错。
  3. Java 的迭代器没有添加元素方法,因为迭代器的主要作用是遍历。
  4. 原理:迭代器有一个成员变量 lastRet 记录了游标元素的前一个元素,通过迭代器删除这个元素时会更新迭代器中的游标和 lastRet 值,将 lastRet 向前移动一个元素,同时将游标指向原本的 lastRet 的位置,这样可以
  5. 保证不会因为删除元素导致某个元素遍历不到

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

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

相关文章

沪深历史行情下载,金融数据库查询

行情在线测试 在线测试 历史行情 jvQuant提供2008创立至今的历史股票行情数据&#xff0c;包含沪深主板、科创板、创业板&#xff0c;股票日内行情。 下载地址 http://jvquant.com/query/history?&token<token>&year<数据年份>.zip Copy 例:下载20…

K8S - 用kubectl远程访问内网的k8s集群

在之前的文章 K8S - 在任意node里执行kubectl 命令 介绍过&#xff0c; 通过任何node 的主机&#xff0c; 用kubectl 管理集群是很简单 无非就是两个步骤: 下载 k8s master 上的admin.conf在当前主机配置 K8SCONFIG 环境变量指向 下载的config file 其他内网主机也适用 其…

【Tools】探索动态隧道代理与普通代理:它们是什么,有何不同?

我已经从你的 全世界路过 像一颗流星 划过命运 的天空 很多话忍住了 不能说出口 珍藏在 我的心中 只留下一些回忆 &#x1f3b5; 牛奶咖啡《从你的全世界路过》 在互联网的世界中&#xff0c;代理服务器&#xff08;Proxy Server&#xff09;是一个重要的…

打字侠是一款PWA网站,如何下载到电脑桌面?

嘿&#xff0c;亲爱的键盘侠们&#xff01; 你是否还在为寻找一款好用的打字练习工具而烦恼&#xff1f;别担心&#xff0c;今天我要给大家介绍一位超级英雄——打字侠&#xff01;它不仅是一个超级酷的打字练习网站&#xff0c;还是一款PWA&#xff08;渐进式网页应用&#x…

在LUAT中使用MQTT客户端,游戏脚本,办公脚本自动操作

本文将介绍在LUAT中工程化使用MQTT客户端的方法及注意事项。实验平台为合宙AIR724UG&#xff0c;其固件版本为Luat_V4001_RDA8910_FLOAT_TMP。 面向对象 使用middleclass库为脚本提供基础面向对象支持&#xff0c;将此repo中的middleclass.lua文件添加到项目中即可使用。middl…

链路聚合LACP

#交换设备 链路聚合 理解链路聚合配置&#xff08;LACP) 什么是LACP LACP&#xff08;Link Aggregation Control Protocol&#xff0c;链路聚合控制协议&#xff09;是一种基于IEEE802.3ad标准的实现链路动态聚合与解聚合的协议&#xff0c;它是链路聚合中常用的一种协议。…

WEB-Wordlist-Generator:为扫描后的Web应用生成相关联的字典

关于WEB-Wordlist-Generator WEB-Wordlist-Generator是一款功能强大的字典生成工具&#xff0c;该工具旨在帮助广大研究人员扫描目标Web应用程序并生成与之相关联的字典文件&#xff0c;从而允许我们对相关的网络威胁行为执行预备性应对策略。 功能介绍 当前版本的WEB-Wordli…

微服务之远程调用

常见的远程调用方式 RPC&#xff1a;Remote Produce Call远程过程调用&#xff0c;类似的还有 。自定义数据格式&#xff0c;基于原生TCP通信&#xff0c;速度快&#xff0c;效率高。早期的webservice&#xff0c;现在热门的dubbo &#xff08;12不再维护、17年维护权交给apac…

【5minC++基本功】——左值与右值|左值引用与右值引用

【5minC基本功】——左值与右值|左值引用与右值引用 1. 为什么要学习左值与右值?2.左值和右值的概念2.1 什么是左值?2.1.1 常见的左值 2.3 什么是右值?2.3.1 常见的纯右值2.2.2 什么是将亡值2.2.3 产生将亡值的情形 1. 为什么要学习左值与右值? C当中的值语义: GC(Garbage…

R语言统计分析——数据集概念和数据结构

参考资料&#xff1a;R语言实战.第2版 1、数据集的概念 数据集通常是由数据构成的一个矩形数组&#xff0c;行表示观测&#xff0c;列表示变量。 不同行业对于数据集的行和列叫法不同。统计学称为观测&#xff08;observation&#xff09;和变量&#xff08;variable&#xff…

动态规划(多重背包+完全背包)

P2851 [USACO06DEC] 最少的硬币 G 题解&#xff1a;从题目上看到那个有n种不同的货币&#xff0c;对于买家来说每个货币有C[ i ]个&#xff0c;是有限个数的&#xff0c;但是对于卖家来说 每个货币都是无限的&#xff0c;题目中要我们求的是买到这个物品的最小交易的货币数&…

[Vue-常见错误]浏览器显示Uncaught runtime errors

文章目录 错误描述正确写法具体如下 错误描述 当前端代码发生错误时&#xff0c;浏览器中出现以下错误提示。 正确写法 显然这不是我们所期望的&#xff0c;在vue.config.js中配置如下设置关闭Uncaught runtime errors显示 devServer: {client: {overlay: false}具体如下 …

Nvidia的成功与竞争:CEO黄仁勋的自信与挑战

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

计算机操作系统基础知识:操作系统体系结构图,操作系统的内核,大内核与微内核的区别和优缺点,时钟管理,原语

1.操作系统体系结构图&#xff1a; 2.操作系统的内核&#xff1a; 时钟管理&#xff1a;利用时钟中断实现计时功能。 原语&#xff1a;原语是一种特殊的程序&#xff0c;具有原子性。也就是说&#xff0c;这段程序运行必须一气呵成&#xff0c;不能被中断。 ubuntu、centos的…

[Llama3] ReAct Prompt 测试实验

ReAct 是一种 LLM 提示和结果处理方法&#xff0c;结合了推理、行动计划和知识源整合&#xff0c;使 LLM 超越其语言模型&#xff0c;并在预测中使用来自现实世界的信息。 ReAct 是推理和行动的结合。 介绍 ReAct 的论文表明它比思维链提示更好。与后者不同的是&#xff0c;Re…

quick4 - hackmyvm

简介 靶机名称&#xff1a;quick4 难度&#xff1a;简单 靶场地址&#xff1a;https://hackmyvm.eu/machines/machine.php?vmQuick4 本地环境 虚拟机&#xff1a;vitual box 靶场IP&#xff08;quick4&#xff09;&#xff1a;192.168.56.104 跳板机IP(windows 11)&…

使用Spring Boot设计对象存储系统

对象存储系统是一种以对象为存储单位的存储架构&#xff0c;适合存储大量非结构化数据&#xff0c;如图片、音视频文件、文档等。MinIO是一个高性能的对象存储系统&#xff0c;基于开源和云原生的设计理念。本文将讨论如何使用Spring Boot设计一个类似MinIO的对象存储系统。 目…

Day17—JavaScript与Ajax请求分析

Ajax(Asynchronous JavaScript and XML)是一种在不重新加载整个页面的情况下,能够与服务器交换数据并更新部分网页的技术。随着Web应用的广泛使用,Ajax请求已成为动态网页数据加载的常见方式。在爬虫中处理JavaScript动态加载的数据,需要对Ajax请求有深入的理解。 1. Aja…

推荐三款你不知道的良心软件

Tico——抠图、拼图软件 抠图软件大家见过很多了把&#xff0c;但是从多张图片中抠出来的图片拼接成一张图片你们很少见过吧。 Tico就是一款将抠出来的图片拼接成一张新图片的软件&#xff0c;目前仅支持IOS平台。 Tico拼贴图提供了强大的图像编辑和处理功能&#xff0c;用户…

论文降痕指南:如何有效降低AIGC率

随着 AI 技术迅猛发展&#xff0c;各种AI辅助论文写作的工具层出不穷&#xff01; 为了防止有人利用AI工具进行论文代写&#xff0c;在最新的学位法中已经明确规定“已经获得学位者&#xff0c;在获得该学位过程中如有人工智能代写等学术不端行为&#xff0c;经学位评定委员会…