【设计模式深度剖析】【5】【行为型】【迭代器模式】
👈️上一篇:策略模式 | 下一篇:中介者模式👉️
设计模式-专栏👈️

文章目录
- 迭代器模式
- 定义
- 英文原话
- 直译
- 如何理解呢?
- 迭代器模式的角色
- 1. Iterator(迭代器)
- 2. ConcreteIterator(具体迭代器)
- 3. Aggregate(聚合)
- 4. ConcreteAggregate(具体聚合)
- 类图
- 代码示例
- 迭代器模式的应用
- 迭代器模式的优点
- 迭代器模式的缺点
- 迭代器模式的使用场景
迭代器模式
迭代器模式(Iterator Pattern)的关键思想:
将对列表的访问和遍历从列表对象中分离出来并放入一个迭代器(iterator)对象中。
迭代器模式就像是一个“导游”,它能够引导我们安全、有序地遍历集合中的“景点”,无需我们亲自去探索整个集合的内部结构。
定义
英文原话
The Iterator pattern provides a way to access the elements of an aggregate object sequentially without exposing its underlying representation.
直译
迭代器模式提供了一种顺序访问聚合对象中的元素的方法,而又不需暴露该对象的内部表示。
如何理解呢?
想象一下,我们有一个装满各种水果的篮子(集合),而我们想逐一品尝每种水果(遍历元素)。但我们不希望直接把手伸进篮子里去取水果(暴露内部表示),因为这样可能会把篮子弄乱。
这时,我们可以使用一个迭代器(比如一个长柄勺),它可以帮助我们按顺序从篮子里取出水果,而不需要我们直接接触到篮子内部。每次我们用勺子取出一颗水果后,它就会指向下一个水果的位置。这样,我们就可以轻松品尝完所有的水果,同时保持篮子的整洁和有序。
迭代器模式就是这样一种工具,它让我们能够方便地遍历集合中的元素,同时保持集合的完整性和封装性。在软件开发中,这种模式的应用场景非常广泛,特别是在处理复杂数据结构时,它能够大大提高代码的可读性和可维护性。
迭代器模式的角色
迭代器模式中的角色通常包括:
1. Iterator(迭代器)
定义了访问和遍历元素的接口。
2. ConcreteIterator(具体迭代器)
实现了迭代器接口,并跟踪遍历中的当前位置。
3. Aggregate(聚合)
定义了创建迭代器对象的接口。
4. ConcreteAggregate(具体聚合)
实现了聚合接口,并返回具体迭代器的实例。
类图

代码示例
// 迭代器接口
interface Iterator {boolean hasNext();Object next();
}// 具体迭代器
class ConcreteIterator implements Iterator {private List<Integer> list;private int currentIndex = 0;public ConcreteIterator(List<Integer> list) {this.list = list;}@Overridepublic boolean hasNext() {return currentIndex < list.size();}@Overridepublic Object next() {if (this.hasNext()) {return list.get(currentIndex++);}return null;}
}// 聚合接口
interface Aggregate {Iterator createIterator();
}// 具体聚合
class ConcreteAggregate implements Aggregate {private List<Integer> list = new ArrayList<>();public void add(Integer item) {list.add(item);}@Overridepublic Iterator createIterator() {return new ConcreteIterator(list);}
}// 客户端代码
public class Client {public static void main(String[] args) {ConcreteAggregate aggregate = new ConcreteAggregate();// 添加一些元素到聚合对象中 for (int i = 0; i < 10; i++) {aggregate.add(i);}// 获取迭代器并遍历聚合对象 Iterator iterator = aggregate.createIterator();while (iterator.hasNext()) {System.out.print(iterator.next()+"\t");}}
}/* Output:
0 1 2 3 4 5 6 7 8 9
*///~
在上面的示例中,我们定义了迭代器接口
Iterator,它有两个方法:hasNext()用于检查是否还有下一个元素,next()用于获取下一个元素。然后,我们创建了ConcreteIterator类来实现这个接口,并跟踪当前遍历的位置。
Aggregate接口定义了创建迭代器的方法,而ConcreteAggregate类实现了这个接口,并提供了一个List来存储元素,并且有一个方法用于返回ConcreteIterator的实例。
在客户端代码中,我们创建了一个ConcreteAggregate对象,并向其中添加了一些元素。然后,我们获取了一个迭代器,并使用它来遍历聚合对象中的所有元素。
迭代器模式的应用
迭代器模式在软件开发中广泛应用于需要遍历集合对象(如列表、集合、映射等)的场景。它提供了一种统一的方式来访问集合中的元素,而不需要关心集合的内部结构和实现细节。通过迭代器,我们可以顺序地访问集合中的每一个元素,同时保持集合的封装性。
迭代器模式的优点
- 简化代码:通过将遍历操作封装在迭代器中,可以避免在客户端代码中编写重复的遍历逻辑,从而简化代码结构。
- 支持多种遍历方式:迭代器模式允许我们在不修改原有代码的情况下,通过实现不同的迭代器类来支持多种遍历方式。
- 隐藏内部实现:迭代器模式将集合的内部实现与遍历操作分离,客户端代码只需要通过迭代器接口来访问集合中的元素,无需关心集合的具体实现。
- 扩展性好:如果需要添加新的集合类,只需要实现对应的迭代器类即可,无需修改原有代码。
迭代器模式的缺点
- 类的个数成对增加:由于迭代器模式将存储数据和遍历数据的职责分离,每增加一个集合类,就需要增加一个对应的迭代器类,这在一定程度上增加了系统的复杂性。
- 可能增加系统开销:由于需要创建迭代器对象来遍历集合,这可能会增加一些额外的系统开销。
迭代器模式的使用场景
- 内容保密:当需要访问集合对象的内容,但又不希望暴露其内部表示时,可以使用迭代器模式。这样可以保持集合的封装性,同时提供一种统一的访问方式。
- 统一接口:当需要为不同的集合结构提供统一的遍历接口时,可以使用迭代器模式。通过实现统一的迭代器接口,可以使得客户端代码更加简洁、可复用。

👈️上一篇:策略模式 | 下一篇:中介者模式👉️
设计模式-专栏👈️
相关文章:
【设计模式深度剖析】【5】【行为型】【迭代器模式】
👈️上一篇:策略模式 | 下一篇:中介者模式👉️ 设计模式-专栏👈️ 文章目录 迭代器模式定义英文原话直译如何理解呢? 迭代器模式的角色1. Iterator(迭代器)2. ConcreteIterator(具体迭代器…...
怎么更快捷的修改图片大小?压缩图片jpg、png、gif的快捷方法
jpg作为最常用的一种图片格式,在遇到图片太大问题时,该如何操作能够快速在压缩图片jpg的大小呢?图片太大无法上传时目前常见的一个使用问题,只有将图片处理到合适的大小才可以正常在平台上传使用,一般情况下想要快速解…...
Shell脚本 if语句
条件测试: $? 返回码 判断命令或者脚本是否执行成功(最近的一条) 0 true 为真就是成功 成立 非0 false 失败或者异常 test命令 可以进行条件测试 然后根据的是返回值来判断条件是否成立。 -e 测试目录或者文件是否存在 exist -d 测试…...
集合查询-并(UNION)集运算、交(INTERSECT)集运算、差(EXCEPT)集运算
一、概述 集合查询是对两个SELECT语句的查询结果进行再进行处理的查询 二、条件 1、两个SELECT语句的查询结果必须是属性列数目相同 2、两个SELECT语句的查询结果必须是对应位置上的属性列必须是相同的数据类型 三、并(UNION)运算 1、语法格式: SELECT 语句1…...
常用的bit位操作
//判断某1位是1还是0 #ifndef GET_BIT #define BIT_IS_1(value,bitpos) (((value)&(1<<(bitpos)))>>(bitpos)) #endif //读取指定位置bit位的值 #ifndef GET_BIT #define GET_BIT(value,bitpos) ((value)&(1<<(bitpos))) #endif //取反指定位置bit位…...
自动控制原理【期末复习】(二)
无人机上桨之后可以在调试架上先调试: 1.根轨迹的绘制 /// 前面针对的是时域分析,下面针对频域分析: 2.波特图 3.奈维斯特图绘制 1.奈氏稳定判据 2.对数稳定判据 3.相位裕度和幅值裕度...
机器学习——集成学习和梯度提升决策树
集成学习 不同的算法都可以对解决同一个问题,但是可能准确率不同,集成学习就是不同算法按照某种组合来解决问题,使得准确率提升。 那怎么组合算法呢? 自举聚合算法**(bagging)** 顾名思义是 自举聚合 自举…...
MYSQL 查看SQL执行计划
一、explain explain select id,db,user,host,command,time,state,info from information_schema.processlist order by time desc; id: 查询的标记,可以查看不同查询的执行顺序。 select_type: 查询的类型,如SIMPLE、SUBQUERY、PRIMARY等。 table: …...
ARM-V9 RME(Realm Management Extension)系统架构之系统安全能力的MPAM
安全之安全(security)博客目录导读 关于RME的MPAM变化的完整定义见在《Arm Architecture Reference Manual Supplement, Memory System Resource Partitioning and Monitoring (MPAM), for A-profile architecture》中详细说明。 实现RME的处理元件(PE)能够生成一个2位的MPAM_…...
cuda 架构设置
import torch torch.cuda.get_device_capability(0) 添加cmake options: -DCMAKE_CUDA_ARCHITECTURES86 -DCMAKE_CUDA_COMPILER/usr/local/cuda-11.8/bin/nvcc cmake工程出现“CMAKE_CUDA_ARCHITECTURES must be non-empty if set.“的解决方法_failed to detec…...
基于 Vue 3 封装一个 ECharts 图表组件
在前端开发中,数据可视化是展示数据的重要方式之一。ECharts 是一个强大的开源可视化库,能够帮助我们轻松地创建各种图表。本文将介绍如何在 Vue 3 项目中使用 ECharts 封装一个图表组件。 代码 <template><div ref"chartRef" styl…...
LeetCode 算法: 旋转图像c++
原题链接🔗: 旋转图像 难度:中等⭐️⭐️ 题目 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图…...
Java Android 静态内部类 以及优雅实现单例模式/避免handler内存泄漏
前言 Java 中的静态内部类(Static Nested Class)是定义在另一个类里面的一个静态类。它和普通的内部类有些区别,主要是静态内部类不需要依赖于外部类的实例就可以被创建和访问。这种类的特性使得它非常适合用来作为辅助类,用于支持外部类的功能。 特点以及使用场景 静态内…...
Flink协调器Coordinator及自定义Operator
Flink协调器Coordinator及自定义Operator 最近的项目开发过程中,使用到了Flink中的协调器以及自定义算子相关的内容,本篇文章主要介绍Flink中的协调器是什么,如何用,以及协调器与算子间的交互。 协调器Coordinator Flink中的协调…...
C调用C++中的类
文章目录 测试代码 测试代码 在C语言中调用C类,需要遵循几个步骤: 在C代码中,确保C类的函数是extern “C”,这样可以防止名称修饰(name mangling)。 使用头文件声明C类的公共接口,并且为这个…...
NFTScan 正式上线 Sei NFTScan 浏览器和 NFT API 数据服务
2024 年 6 月 12 号,NFTScan 团队正式对外发布了 Sei NFTScan 浏览器,将为 Sei 生态的 NFT 开发者和用户提供简洁高效的 NFT 数据搜索查询服务。NFTScan 作为全球领先的 NFT 数据基础设施服务商,Sei 是继 Bitcoin、Ethereum、BNBChain、Polyg…...
2024年高考:计算机相关专业前景分析与选择建议
2024年高考结束,面对计算机专业是否仍具有吸引力的讨论,本文将从行业趋势、就业市场、个人兴趣与能力、专业选择建议等多个角度进行深入分析,以帮助考生和家长做出明智的决策。 文章目录 一、行业趋势与就业市场1. 计算机行业的发展与变革2. …...
SQL聚合函数---汇总数据
此篇文章内容均来自与mysql必知必会教材,后期有衍生会继续更新、补充知识体系结构 文章目录 SQL聚集函数表:AGV()count()根据需求可以进行组合处理 max()min()max()、min()、avg()组…...
webpack5新特性
webpack5新特性 持久化缓存资源模块moduleIds & chunkIds的优化更智能的tree shakingnodeJs的polyfill脚本被移除支持生成e6/es2015的代码SplitChunk和模块大小Module Federation 持久化缓存 缓存生成的webpack模块和chunk,来改善构建速度cache 会在开发模式被设置成 ty…...
java单体服务自定义锁名称工具类
需求: 操作员能够对自己权限下的用户数据进行数据填充,但是不同操作员之间可能会有重复的用户数据,为了避免操作员覆盖数据或者重复操作数据,应该在操作用户数据时加锁,要求加的这一把锁必须是细粒度的锁,…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...
基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...
CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...
(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...
【生成模型】视频生成论文调研
工作清单 上游应用方向:控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...
保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...
