【设计模式深度剖析】【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单体服务自定义锁名称工具类
需求: 操作员能够对自己权限下的用户数据进行数据填充,但是不同操作员之间可能会有重复的用户数据,为了避免操作员覆盖数据或者重复操作数据,应该在操作用户数据时加锁,要求加的这一把锁必须是细粒度的锁,…...
【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...
Java - Mysql数据类型对应
Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...
Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...
安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖
在Vuzix M400 AR智能眼镜的助力下,卢森堡罗伯特舒曼医院(the Robert Schuman Hospitals, HRS)凭借在无菌制剂生产流程中引入增强现实技术(AR)创新项目,荣获了2024年6月7日由卢森堡医院药剂师协会࿰…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
