设计模式教程:迭代器模式(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. 总结
迭代器模式是一种非常常见的设计模式,尤其适用于需要遍历集合对象时。通过使用迭代器,我们能够避免暴露集合的内部结构,使得代码更加模块化、灵活,也能支持多种遍历方式。
希望这个教程对你理解迭代器模式有所帮助!
版权声明
- 本文内容属于原创,欢迎转载,但请务必注明出处和作者,尊重原创版权。
- 转载时,请附带原文链接并注明“本文作者:扣丁梦想家
- 禁止未经授权的商业转载。
如果您有任何问题或建议,欢迎留言讨论。
相关文章:
设计模式教程:迭代器模式(Iterator Pattern)
迭代器模式(Iterator Pattern)是设计模式中的一种行为型模式,它允许顺序访问一个集合对象中的元素,而无需暴露集合对象的内部结构。换句话说,迭代器模式提供了一个方法,能让你遍历集合中的元素,…...
C语言学习【1】C语言关于寄存器的封装
目录 1.封装寄存的C语言的语法volatile:unsigned int:*pGpiobOdrvolatile unsigned int * 2.进一步C语言的封装 在嵌入式中,底层一定是操作寄存器,我有一个理念,凡事一定要想清楚,把任何知识点融入自己的理解之中&…...
鸿蒙app 开发中的 == 和 === 的区别
在鸿蒙 App 开发中,如果你使用 JavaScript 或 TypeScript 进行编码, 和 是用于比较值的运算符,它们的主要区别在于比较的严格程度,下面为你详细介绍: 1. (宽松相等运算符) 比较规则࿱…...
【算法】冒泡排序
目录 一、算法概述 二、算法原理 1. 核心思想 2. 排序过程演示 三、标准实现代码 四、时间复杂度分析 五、优化策略 1. 提前终止优化 2. 记录最后交换位置 六、算法特性 七、实际应用 八、扩展思考 九、总结 一、算法概述 冒泡排序(Bubble Sort࿰…...
R Excel 文件:高效数据处理的利器
R Excel 文件:高效数据处理的利器 在数据分析领域,R语言因其强大的统计分析和可视化功能而备受推崇。而R Excel文件,作为R语言与Excel的桥梁,使得数据在R和Excel之间的高效转换成为可能。本文将详细介绍R Excel文件的概念、应用场景以及操作方法。 一、R Excel文件的概念…...
数据库(MySQL):使用命令从零开始在Navicat创建一个数据库及其数据表(一).创建基础表
一. 使用工具和命令 1.1 使用的工具 Navicat Premium 17 :“Navicat”是一套可创建多个连接的数据库管理工具。 MySQL版本8.0.39 。 1.2 使用的命令 Navicat中使用的命令 命令 命令解释 SHOW DATABASES; 展示所有的数据库 CREATE DATABASE 数据…...
电力通信物联网应用,国密网关守护电力数据安全
电力国密网关是用于保护电力调度数据网路由器和电力系统的局域网之间通信安全的电力专用网关机,主要为上下级控制系统之间的广域网通信提供认证与加密服务,实现数据传输的机密性、完整性。 国密算法网关功能特点 身份认证:对接入的设备和用户…...
vue:vite 代理服务器 proxy 配置
Vite 代理服务器(Proxy)的配置通常用于开发环境,以解决跨域请求等问题。以下是一个详细的配置步骤: 通过以上步骤,你就可以在 Vite 项目中配置代理服务器,以便在开发过程中方便地访问后端服务。 找到 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+集装箱号码识别技术,主要发展方向和应用潜力
集装箱号码识别技术作为物流数字化的重要工具,其应用前景随着全球供应链的智能化升级和绿色转型需求不断扩大。结合当前技术发展和行业实践,以下是其未来的主要发展方向和应用潜力: 1.物流与港口智能化管理 自动化识别与效率提升࿱…...
安装可视化jar包部署平台JarManage
一、下载 下载地址:JarManage 发行版 - Gitee.com 🚒 下载 最新发行版 下载zip的里面linux和windows版本都有 二、运行 上传到服务器,解压进入目录 🚚 执行java -jar jarmanage-depoly.jar 命令运行 java -jar jarmanage-dep…...
后端之JPA(EntityGraph+JsonView)
不同表之间的级联操作或者说关联查询是很多业务场景都会用到的。 对于这种需求最朴素的方法自然是手动写关联表,然后对被关联的表也是手动插入数据。但是手写容易最后写成一堆shit代码,而且修改起来也是非常麻烦的。 学会使用现成的工具还是非常有利的…...
Java数据结构第十三期:走进二叉树的奇妙世界(二)
专栏:数据结构(Java版) 个人主页:手握风云 目录 一、二叉树的遍历 1.1. 前序遍历 1.2. 中序遍历 1.3. 后序遍历 1.4. 完整代码 二、二叉树的基本操作 2.1. 获取树中结点个数 2.1. 获取叶子结点个数 2.3. 获取第k层结点的个数 2.4. 获取二叉树的…...
JavaScript系列(86)--现代构建工具详解
JavaScript 现代构建工具详解 🔨 现代前端开发离不开构建工具,它们帮助我们处理模块打包、代码转换、资源优化等任务。让我们深入了解主流的构建工具及其应用。 构建工具概述 🌟 💡 小知识:构建工具主要解决代码转换…...
docker容器网络配置及常用操作
Linux内核实现名称空间的创建 ip netns(网络名称空间)命令 可以借助ip netns命令来完成对 Network Namespace 的各种操作。ip netns命令来自于iproute安装包,一般系统会默认安装,如果没有的话,请自行安装。 注意&am…...
Docker 性能优化指南
Docker 提供了强大的容器化功能,能够帮助开发者在不同的环境中构建、测试和部署应用。然而,随着容器化应用的不断增长,Docker 容器可能会面临一些性能瓶颈,影响其运行效率、资源占用和扩展能力。为了确保容器在生产环境中的高效运…...
课程1. 深度学习简介
课程1. 深度学习简介 神经网络结构逻辑回归XOR问题(异或问题) 中间特征的生成全连接神经网络中间网络层的激活函数Sigmoid函数Tanh函数ReLU函数其它激活函数 使用全连接神经网络解决 XOR 问题神经网络用于回归问题训练神经网络 不同类型的神经网络 附加材…...
【cuda学习日记】4.3 结构体数组与数组结构体
4.3 数组结构体(AoS)和结构体数组(SoA) 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代码
一、基于导航变量的多目标粒子群优化算法(NMOPSO)介绍 基于导航变量的多目标粒子群优化算法(Navigation variable-based multi-objective particle swarm optimization,NMOPSO)是2025年提出的一种用于无人机路径规划的…...
数字IC后端设计实现OCC(On-chip Clock Controller)电路介绍及时钟树综合案例
数字IC后端时钟树综合专题(OCC电路案例分享) 复杂时钟设计时钟树综合(clock tree synthesis)常见20个典型案例 1、什么是OCC? 片上时钟控制器(On-chip Clock Controllers ,OCC),也称为扫描时钟控制器(Scan Clock Con…...
【LLM转型三周年纪念——Harness agent 理解】成为每个读者的独家记忆,从第一性原则出发,一文打穿你的AI幻觉,
前言 本文动机是从CV到NLP的三年 LLM转型的历程,趁着harness agent 热度 ,主观视角下对当前一些事情的理解观点,希望对读者有所启发和帮助,并且我也将我的观点和新发布的opus4.7 进行了一波讨论,这也是我决定发出来的…...
docker运行容器
【-it交互式启动容器】docker run -it --gpus all --networkhost --ipchost --rm --name qwen3.5-test \-v /home/vllm-models/Qwen3___5-35B-A3B:/home/vllm-models/Qwen3___5-35B-A3B \-v /etc/localtime:/etc/localtime:ro \-v /etc/timezone:/etc/timezone:ro \--entrypoin…...
保姆级教程:用Python搞定Semantic Drone Dataset的掩码图生成与数据加载(附完整代码)
从零构建无人机语义分割数据管道:Semantic Drone Dataset实战指南 当第一次打开Semantic Drone Dataset的压缩包时,很多开发者会陷入茫然——6000x4000像素的原始图像、复杂的目录结构、没有现成的掩码文件。这份数据集就像未经雕琢的玉石,需…...
大麦网自动抢票脚本:3分钟快速部署,轻松应对热门演唱会秒杀
大麦网自动抢票脚本:3分钟快速部署,轻松应对热门演唱会秒杀 【免费下载链接】Automatic_ticket_purchase 大麦网抢票脚本 项目地址: https://gitcode.com/GitHub_Trending/au/Automatic_ticket_purchase 还在为抢不到热门演唱会门票而烦恼吗&…...
Calibre中文路径保护插件:告别拼音路径,让中文电子书管理更优雅
Calibre中文路径保护插件:告别拼音路径,让中文电子书管理更优雅 【免费下载链接】calibre-do-not-translate-my-path Switch my calibre library from ascii path to plain Unicode path. 将我的书库从拼音目录切换至非纯英文(中文࿰…...
TI毫米波雷达选型指南:IWR6843 vs IWR1843性能对比与实战场景解析
TI毫米波雷达选型指南:IWR6843 vs IWR1843性能对比与实战场景解析 毫米波雷达技术正在重塑工业检测、智能交通和自动化控制领域的感知能力。作为该领域的核心器件,德州仪器(TI)的IWR系列毫米波雷达凭借其高集成度和卓越性能&…...
利用TIGRAMITE进行时间序列因果分析:从数据准备到可视化全流程
1. TIGRAMITE入门:时间序列因果分析利器 第一次接触TIGRAMITE是在分析气象数据时,当时需要找出温度、湿度、风速之间的因果关系链。这个Python包让我眼前一亮——它不仅能自动识别变量间的因果方向,还能精确捕捉时间滞后效应。TIGRAMITE基于…...
AGI可靠性如何量化?揭秘ISO/IEC 23894合规测试框架的5层验证漏斗
第一章:AGI可靠性如何量化?揭秘ISO/IEC 23894合规测试框架的5层验证漏斗 2026奇点智能技术大会(https://ml-summit.org) AGI系统的可靠性不能依赖主观评估或单一指标,而需依托可复现、可审计、可跨组织比对的标准化验证路径。ISO/IEC 23894:…...
VS Code Mermaid插件深度解析:技术文档图表渲染的架构内幕
VS Code Mermaid插件深度解析:技术文档图表渲染的架构内幕 【免费下载链接】vscode-markdown-mermaid Adds Mermaid diagram and flowchart support to VS Codes builtin markdown preview 项目地址: https://gitcode.com/gh_mirrors/vs/vscode-markdown-mermaid …...
深入剖析C# OPC UA 服务器端源码:纯代码实现,无第三方支持库
C# OPC UA 服务器端源码 该源码未使用任何第三方支持库,纯代码实现一、项目概述 该源码是一个基于 C# 语言开发的 OPC UA 服务器端实现,未依赖任何第三方支持库,采用纯原生代码构建,遵循 OPC UA 规范,提供了完整的工业…...
