当前位置: 首页 > news >正文

设计模式教程:迭代器模式(Iterator Pattern)

迭代器模式(Iterator Pattern)是设计模式中的一种行为型模式,它允许顺序访问一个集合对象中的元素,而无需暴露集合对象的内部结构。换句话说,迭代器模式提供了一个方法,能让你遍历集合中的元素,而无需知道底层实现细节。

1. 迭代器模式的基本概念

  • 迭代器(Iterator):一个用来遍历集合元素的接口。
  • 容器(Aggregate):提供集合元素的容器,通常是一个集合类,比如List、Set等。
  • 具体迭代器(Concrete Iterator):实现迭代器接口的具体类,定义了如何遍历集合。
  • 具体容器(Concrete Aggregate):实现容器接口的具体类,维护一个集合并返回相应的迭代器。

2. 迭代器模式的结构

  • Iterator接口:定义了获取迭代器元素的方法,如hasNext()next()
  • ConcreteIterator类:实现了Iterator接口,负责具体的遍历操作。
  • Aggregate接口:定义了创建迭代器的方法。
  • ConcreteAggregate类:实现了Aggregate接口,返回具体的迭代器对象。

3. 迭代器模式的优点

  • 解耦:客户端不需要知道集合的具体实现,迭代器模式提供了一种统一的访问方式。
  • 单一职责:迭代器负责遍历集合,而集合类只负责存储数据。
  • 支持多种遍历方式:可以根据不同需求,实现不同的迭代器来支持不同的遍历方式。

4. 迭代器模式的缺点

  • 增加了类的数量:每一个容器对象都需要有一个对应的迭代器类。
  • 每个集合的遍历都需要一个迭代器对象,会引入额外的内存消耗。

5. 迭代器模式的应用场景

  • 集合类遍历:当你需要访问一个集合中的元素,但又不想暴露集合的内部结构时,迭代器模式非常有用。
  • 数据结构的设计:例如链表、树、图等复杂数据结构的遍历。
  • 多种遍历方式:同一个集合可以提供多种遍历方式,比如正向遍历、逆向遍历、并行遍历等。

6. Java代码示例

下面是一个使用Java实现迭代器模式的简单示例:

6.1 定义迭代器接口

// 迭代器接口
public interface Iterator {boolean hasNext();  // 是否有下一个元素Object next();      // 获取下一个元素
}

6.2 定义容器接口

// 容器接口
public interface Aggregate {Iterator createIterator();  // 创建迭代器
}

6.3 实现具体的容器类

// 具体容器类
public class ConcreteAggregate implements Aggregate {private Object[] items;private int size;public ConcreteAggregate(int size) {this.items = new Object[size];this.size = size;}public void addItem(int index, Object item) {if (index >= 0 && index < size) {items[index] = item;}}@Overridepublic Iterator createIterator() {return new ConcreteIterator(this);}public Object getItem(int index) {if (index >= 0 && index < size) {return items[index];}return null;}public int getSize() {return size;}
}

6.4 实现具体的迭代器类

// 具体迭代器类
public class ConcreteIterator implements Iterator {private ConcreteAggregate aggregate;private int currentIndex = 0;public ConcreteIterator(ConcreteAggregate aggregate) {this.aggregate = aggregate;}@Overridepublic boolean hasNext() {return currentIndex < aggregate.getSize();}@Overridepublic Object next() {return hasNext() ? aggregate.getItem(currentIndex++) : null;}
}

6.5 使用迭代器遍历容器

public class Main {public static void main(String[] args) {ConcreteAggregate aggregate = new ConcreteAggregate(3);aggregate.addItem(0, "Element 1");aggregate.addItem(1, "Element 2");aggregate.addItem(2, "Element 3");Iterator iterator = aggregate.createIterator();while (iterator.hasNext()) {System.out.println(iterator.next());}}
}

6.6 输出结果

Element 1
Element 2
Element 3

7. 总结

迭代器模式是一种非常常见的设计模式,尤其适用于需要遍历集合对象时。通过使用迭代器,我们能够避免暴露集合的内部结构,使得代码更加模块化、灵活,也能支持多种遍历方式。

希望这个教程对你理解迭代器模式有所帮助!

版权声明
  1. 本文内容属于原创,欢迎转载,但请务必注明出处和作者,尊重原创版权。
  2. 转载时,请附带原文链接并注明“本文作者:扣丁梦想家
  3. 禁止未经授权的商业转载。

如果您有任何问题或建议,欢迎留言讨论。

相关文章:

设计模式教程:迭代器模式(Iterator Pattern)

迭代器模式&#xff08;Iterator Pattern&#xff09;是设计模式中的一种行为型模式&#xff0c;它允许顺序访问一个集合对象中的元素&#xff0c;而无需暴露集合对象的内部结构。换句话说&#xff0c;迭代器模式提供了一个方法&#xff0c;能让你遍历集合中的元素&#xff0c;…...

C语言学习【1】C语言关于寄存器的封装

目录 1.封装寄存的C语言的语法volatile&#xff1a;unsigned int:*pGpiobOdrvolatile unsigned int * 2.进一步C语言的封装 在嵌入式中&#xff0c;底层一定是操作寄存器&#xff0c;我有一个理念&#xff0c;凡事一定要想清楚&#xff0c;把任何知识点融入自己的理解之中&…...

鸿蒙app 开发中的 == 和 === 的区别

在鸿蒙 App 开发中&#xff0c;如果你使用 JavaScript 或 TypeScript 进行编码&#xff0c; 和 是用于比较值的运算符&#xff0c;它们的主要区别在于比较的严格程度&#xff0c;下面为你详细介绍&#xff1a; 1. &#xff08;宽松相等运算符&#xff09; 比较规则&#xff1…...

【算法】冒泡排序

目录 一、算法概述 二、算法原理 1. 核心思想 2. 排序过程演示 三、标准实现代码 四、时间复杂度分析 五、优化策略 1. 提前终止优化 2. 记录最后交换位置 六、算法特性 七、实际应用 八、扩展思考 九、总结 一、算法概述 冒泡排序&#xff08;Bubble Sort&#xff0…...

R Excel 文件:高效数据处理的利器

R Excel 文件:高效数据处理的利器 在数据分析领域,R语言因其强大的统计分析和可视化功能而备受推崇。而R Excel文件,作为R语言与Excel的桥梁,使得数据在R和Excel之间的高效转换成为可能。本文将详细介绍R Excel文件的概念、应用场景以及操作方法。 一、R Excel文件的概念…...

数据库(MySQL):使用命令从零开始在Navicat创建一个数据库及其数据表(一).创建基础表

一. 使用工具和命令 1.1 使用的工具 Navicat Premium 17 &#xff1a;“Navicat”是一套可创建多个连接的数据库管理工具。 MySQL版本8.0.39 。 1.2 使用的命令 Navicat中使用的命令 命令 命令解释 SHOW DATABASES&#xff1b; 展示所有的数据库 CREATE DATABASE 数据…...

电力通信物联网应用,国密网关守护电力数据安全

电力国密网关是用于保护电力调度数据网路由器和电力系统的局域网之间通信安全的电力专用网关机&#xff0c;主要为上下级控制系统之间的广域网通信提供认证与加密服务&#xff0c;实现数据传输的机密性、完整性。 国密算法网关功能特点 身份认证&#xff1a;对接入的设备和用户…...

vue:vite 代理服务器 proxy 配置

Vite 代理服务器&#xff08;Proxy&#xff09;的配置通常用于开发环境&#xff0c;以解决跨域请求等问题。以下是一个详细的配置步骤&#xff1a; 通过以上步骤&#xff0c;你就可以在 Vite 项目中配置代理服务器&#xff0c;以便在开发过程中方便地访问后端服务。 ‌找到 Vi…...

Java【网络原理】(2)初识网络续与网络编程

目录 1.前言 2.正文 2.1TCP协议与UDP协议 2.2socket API进行网络编程 2.2.1DatagramPacket类 2.2.1.1发送数据报 2.2.1.2接收数据报 2.2.1.3获取数据报内容 2.2.1.4设置数据报内容 2.2.2DatagramSocket类 2.2.2.1构造方法 2.2.2.2常用方法 2.2.3具体代码与解释 3…...

AI+集装箱号码识别技术,主要发展方向和应用潜力

集装箱号码识别技术作为物流数字化的重要工具&#xff0c;其应用前景随着全球供应链的智能化升级和绿色转型需求不断扩大。结合当前技术发展和行业实践&#xff0c;以下是其未来的主要发展方向和应用潜力&#xff1a; 1.物流与港口智能化管理 自动化识别与效率提升&#xff1…...

安装可视化jar包部署平台JarManage

一、下载 下载地址&#xff1a;JarManage 发行版 - Gitee.com &#x1f692; 下载 最新发行版 下载zip的里面linux和windows版本都有 二、运行 上传到服务器&#xff0c;解压进入目录 &#x1f69a; 执行java -jar jarmanage-depoly.jar 命令运行 java -jar jarmanage-dep…...

后端之JPA(EntityGraph+JsonView)

不同表之间的级联操作或者说关联查询是很多业务场景都会用到的。 对于这种需求最朴素的方法自然是手动写关联表&#xff0c;然后对被关联的表也是手动插入数据。但是手写容易最后写成一堆shit代码&#xff0c;而且修改起来也是非常麻烦的。 学会使用现成的工具还是非常有利的…...

Java数据结构第十三期:走进二叉树的奇妙世界(二)

专栏&#xff1a;数据结构(Java版) 个人主页&#xff1a;手握风云 目录 一、二叉树的遍历 1.1. 前序遍历 1.2. 中序遍历 1.3. 后序遍历 1.4. 完整代码 二、二叉树的基本操作 2.1. 获取树中结点个数 2.1. 获取叶子结点个数 2.3. 获取第k层结点的个数 2.4. 获取二叉树的…...

JavaScript系列(86)--现代构建工具详解

JavaScript 现代构建工具详解 &#x1f528; 现代前端开发离不开构建工具&#xff0c;它们帮助我们处理模块打包、代码转换、资源优化等任务。让我们深入了解主流的构建工具及其应用。 构建工具概述 &#x1f31f; &#x1f4a1; 小知识&#xff1a;构建工具主要解决代码转换…...

docker容器网络配置及常用操作

Linux内核实现名称空间的创建 ip netns&#xff08;网络名称空间&#xff09;命令 可以借助ip netns命令来完成对 Network Namespace 的各种操作。ip netns命令来自于iproute安装包&#xff0c;一般系统会默认安装&#xff0c;如果没有的话&#xff0c;请自行安装。 注意&am…...

Docker 性能优化指南

Docker 提供了强大的容器化功能&#xff0c;能够帮助开发者在不同的环境中构建、测试和部署应用。然而&#xff0c;随着容器化应用的不断增长&#xff0c;Docker 容器可能会面临一些性能瓶颈&#xff0c;影响其运行效率、资源占用和扩展能力。为了确保容器在生产环境中的高效运…...

课程1. 深度学习简介

课程1. 深度学习简介 神经网络结构逻辑回归XOR问题&#xff08;异或问题&#xff09; 中间特征的生成全连接神经网络中间网络层的激活函数Sigmoid函数Tanh函数ReLU函数其它激活函数 使用全连接神经网络解决 XOR 问题神经网络用于回归问题训练神经网络 不同类型的神经网络 附加材…...

【cuda学习日记】4.3 结构体数组与数组结构体

4.3 数组结构体&#xff08;AoS&#xff09;和结构体数组&#xff08;SoA&#xff09; AoS方法进行存储 struct innerStruct{float x;float y; };struct innerStruct myAOS[N];SoA方法来存储数据 struct innerArray{float x[N];float y[N]; };struct innerArray moa;如图说明…...

2025最新高维多目标优化:基于城市场景下无人机三维路径规划的导航变量的多目标粒子群优化算法(NMOPSO),MATLAB代码

一、基于导航变量的多目标粒子群优化算法&#xff08;NMOPSO&#xff09;介绍 基于导航变量的多目标粒子群优化算法&#xff08;Navigation variable-based multi-objective particle swarm optimization&#xff0c;NMOPSO&#xff09;是2025年提出的一种用于无人机路径规划的…...

数字IC后端设计实现OCC(On-chip Clock Controller)电路介绍及时钟树综合案例

数字IC后端时钟树综合专题&#xff08;OCC电路案例分享&#xff09; 复杂时钟设计时钟树综合(clock tree synthesis)常见20个典型案例 1、什么是OCC&#xff1f; 片上时钟控制器(On-chip Clock Controllers &#xff0c;OCC)&#xff0c;也称为扫描时钟控制器(Scan Clock Con…...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架&#xff0c;专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用&#xff0c;其中包含三个使用通用基本模板的页面。在此…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】

微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来&#xff0c;Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

服务器硬防的应用场景都有哪些?

服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式&#xff0c;避免服务器受到各种恶意攻击和网络威胁&#xff0c;那么&#xff0c;服务器硬防通常都会应用在哪些场景当中呢&#xff1f; 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!

5月28日&#xff0c;中天合创屋面分布式光伏发电项目顺利并网发电&#xff0c;该项目位于内蒙古自治区鄂尔多斯市乌审旗&#xff0c;项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站&#xff0c;总装机容量为9.96MWp。 项目投运后&#xff0c;每年可节约标煤3670…...

04-初识css

一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...

JVM 内存结构 详解

内存结构 运行时数据区&#xff1a; Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器&#xff1a; ​ 线程私有&#xff0c;程序控制流的指示器&#xff0c;分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 ​ 每个线程都有一个程序计数…...

LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》

这段 Python 代码是一个完整的 知识库数据库操作模块&#xff0c;用于对本地知识库系统中的知识库进行增删改查&#xff08;CRUD&#xff09;操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 &#x1f4d8; 一、整体功能概述 该模块…...

【JVM】Java虚拟机(二)——垃圾回收

目录 一、如何判断对象可以回收 &#xff08;一&#xff09;引用计数法 &#xff08;二&#xff09;可达性分析算法 二、垃圾回收算法 &#xff08;一&#xff09;标记清除 &#xff08;二&#xff09;标记整理 &#xff08;三&#xff09;复制 &#xff08;四&#xff…...

iview框架主题色的应用

1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题&#xff0c;无需引入&#xff0c;直接可…...

打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用

一、方案背景​ 在现代生产与生活场景中&#xff0c;如工厂高危作业区、医院手术室、公共场景等&#xff0c;人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式&#xff0c;存在效率低、覆盖面不足、判断主观性强等问题&#xff0c;难以满足对人员打手机行为精…...