设计模式-迭代器模式(Iterator)
设计模式-迭代器模式(Iterator)
- 一、迭代器模式概述
- 1.1 什么是迭代器模式
- 1.2 简单实现迭代器模式
- 1.3 使用迭代器模式的注意事项
- 二、迭代器模式的用途
- 三、迭代器模式实现方式
- 3.1 使用Iterator接口实现迭代器模式
- 3.2 使用Iterable接口和Iterator接口实现迭代器模式
- 3.3 使用匿名内部类实现迭代器模式
- 3.4 使用Lambda表达式实现迭代器模式
一、迭代器模式概述
1.1 什么是迭代器模式
迭代器模式是一种设计模式,它用于提供一种方法来访问一个容器对象中的各个元素,而又不暴露该对象的内部表示。
在迭代器模式中,我们定义一个抽象的迭代器类,它包含两个方法:一个是hasNext()方法,用于判断是否还有下一个元素;另一个是next()方法,用于获取下一个元素。然后,每个容器类都实现自己的迭代器类,以访问容器中的元素。
1.2 简单实现迭代器模式
首先,我们定义一个接口Iterator,它表示一个迭代器:
interface Iterator {boolean hasNext();Object next();
}
然后,我们可以实现一些具体的迭代器类,例如数组迭代器和列表迭代器:
class ArrayIterator implements Iterator {private final int[] array;private int index;public ArrayIterator(int[] array) {this.array = array;this.index = 0;}@Overridepublic boolean hasNext() {return index < array.length;}@Overridepublic Object next() {return array[index++];}
}class ListIterator implements Iterator {private final List<Object> list;private int index;public ListIterator(List<Object> list) {this.list = list;this.index = 0;}@Overridepublic boolean hasNext() {return index < list.size();}@Overridepublic Object next() {return list.get(index++);}
}
接下来,我们可以使用这些迭代器类来遍历容器中的元素:
int[] array = {1, 2, 3, 4, 5};
ArrayIterator arrayIterator = new ArrayIterator(array);
while (arrayIterator.hasNext()) {System.out.println(arrayIterator.next()); // 输出:1, 2, 3, 4, 5
}
List<Object> list = new ArrayList<>();
list.add("apple");
list.add("banana");
list.add("orange");
ListIterator listIterator = new ListIterator(list);
while (listIterator.hasNext()) {System.out.println(listIterator.next()); // 输出:apple, banana, orange
}
1.3 使用迭代器模式的注意事项
-
1、容器对象需要实现Iterable接口,并实现iterator()方法,该方法返回一个迭代器对象。
-
2、迭代器对象需要实现Iterator接口,并实现hasNext()和next()方法。
-
3、在使用迭代器遍历容器中的元素时,需要先调用hasNext()方法判断是否还有下一个元素,如果有再调用next()方法获取下一个元素。
-
4、在遍历过程中,如果修改了容器中的元素,可能会导致迭代器失效或抛出异常。因此,在遍历过程中应该避免对容器进行修改操作。
-
5、如果需要在遍历过程中删除容器中的元素,可以使用迭代器的remove()方法。但是需要注意的是,在使用remove()方法后,迭代器将指向被删除元素的下一个元素,而不是当前元素。因此,在使用remove()方法后,需要再次调用next()方法才能获取正确的元素。
-
6、如果需要在遍历过程中添加元素到容器中,可以使用迭代器的add()方法。但是需要注意的是,在使用add()方法后,迭代器将指向新添加的元素,而不是当前元素。因此,在使用add()方法后,需要再次调用next()方法才能获取正确的元素。
二、迭代器模式的用途
-
1、支持以不同的方式遍历一个聚合对象:迭代器模式将聚合对象的遍历行为分离出来,提供了多种遍历方式。
-
2、简化了聚合类:通过引入迭代器,可以将遍历逻辑从聚合类中分离出来,使得聚合类的职责更加单一。
-
3、增加了代码的灵活性和可扩展性:由于引入了抽象层,增加新的聚合类和迭代器类都很方便,无需修改原有代码。
-
4、让外部代码能够透明地访问集合内部的数据:迭代器负责集合对象的遍历,可以让外部的代码无需关心集合的内部表示,而直接访问其中的数据。
三、迭代器模式实现方式
3.1 使用Iterator接口实现迭代器模式
要使用Java中的Iterator接口实现迭代器模式,首先需要创建一个实现了Iterable接口的类要使用Java中的Iterator接口实现迭代器模式,首先需要创建一个实现了Iterable接口的类,然后在该类中实现iterator()方法。接下来,创建一个实现了Iterator接口的类,并在该类中实现hasNext()和next()方法。以下是一个简单的示例:
// 创建一个实现了Iterable接口的类
class MyIterable implements Iterable<String> {private String[] items;public MyIterable(String[] items) {this.items = items;}// 实现iterator()方法@Overridepublic Iterator<String> iterator() {return new MyIterator();}
}// 创建一个实现了Iterator接口的类
class MyIterator implements Iterator<String> {private int index;private String[] items;public MyIterator() {this.index = 0;}// 实现hasNext()方法@Overridepublic boolean hasNext() {return index < items.length;}// 实现next()方法@Overridepublic String next() {return items[index++];}
}public class Main {public static void main(String[] args) {String[] items = {"A", "B", "C", "D"};MyIterable myIterable = new MyIterable(items);for (String item : myIterable) {System.out.println(item);}}
}
在这个示例中,我们创建了一个名为MyIterable的类,它实现了Iterable接口。我们还创建了一个名为MyIterator的类,它实现了Iterator接口。在主方法中,我们创建了一个MyIterable对象,并使用for-each循环遍历其元素。
3.2 使用Iterable接口和Iterator接口实现迭代器模式
要使用Java中的Iterable接口和Iterator接口实现迭代器模式,首先需要创建一个类实现Iterable接口,然后在该类中实现iterator()方法。接下来,创建一个实现Iterator接口的类,并在该类中实现hasNext()和next()方法。以下是一个简单的示例:
// 创建一个实现Iterable接口的类
class MyIterable implements Iterable<Integer> {private int[] data;public MyIterable(int[] data) {this.data = data;}// 实现iterator()方法@Overridepublic Iterator<Integer> iterator() {return new MyIterator();}
}// 创建一个实现Iterator接口的类
class MyIterator implements Iterator<Integer> {private int[] data;private int index;public MyIterator() {this.index = 0;}// 实现hasNext()方法@Overridepublic boolean hasNext() {return index < data.length;}// 实现next()方法@Overridepublic Integer next() {return data[index++];}
}public class Main {public static void main(String[] args) {int[] data = {1, 2, 3, 4, 5};MyIterable myIterable = new MyIterable(data);for (int num : myIterable) {System.out.println(num);}}
}
在这个示例中,我们创建了一个名为MyIterable的类,它实现了Iterable接口。我们还创建了一个名为MyIterator的类,它实现了Iterator接口。在主方法中,我们创建了一个MyIterable对象,并使用for-each循环遍历其元素。
3.3 使用匿名内部类实现迭代器模式
在Java中,可以使用匿名内部类实现迭代器模式。以下是一个简单的示例:
import java.util.Iterator;public class AnonymousInnerClassIterator {public static void main(String[] args) {int[] numbers = {1, 2, 3, 4, 5};// 使用匿名内部类实现迭代器模式Iterator<Integer> iterator = new Iterator<Integer>() {private int index = 0;@Overridepublic boolean hasNext() {return index < numbers.length;}@Overridepublic Integer next() {return numbers[index++];}};// 遍历数组并打印元素while (iterator.hasNext()) {System.out.println(iterator.next());}}
}
在这个示例中,我们创建了一个匿名内部类实现了Iterator接口,并重写了hasNext()和next()方法。然后,我们使用这个匿名内部类的实例来遍历一个整数数组。
3.4 使用Lambda表达式实现迭代器模式
在Java中,可以使用Lambda表达式实现迭代器模式。以下是一个简单的示例:
首先,创建一个接口Iterator,包含两个方法:hasNext()和next()。
public interface Iterator<T> {boolean hasNext();T next();
}
然后,创建一个类MyIterator,实现Iterator接口。在这个类中,使用Lambda表达式定义hasNext()和next()方法。
import java.util.function.Supplier;public class MyIterator<T> implements Iterator<T> {private T[] items;private int index = 0;public MyIterator(T[] items) {this.items = items;}@Overridepublic boolean hasNext() {return index < items.length;}@Overridepublic T next() {return items[index++];}
}
最后,在主函数中使用MyIterator类。
public class Main {public static void main(String[] args) {Integer[] numbers = {1, 2, 3, 4, 5};MyIterator<Integer> iterator = new MyIterator<>(numbers);while (iterator.hasNext()) {System.out.println(iterator.next());}}
}
相关文章:
设计模式-迭代器模式(Iterator)
设计模式-迭代器模式(Iterator) 一、迭代器模式概述1.1 什么是迭代器模式1.2 简单实现迭代器模式1.3 使用迭代器模式的注意事项 二、迭代器模式的用途三、迭代器模式实现方式3.1 使用Iterator接口实现迭代器模式3.2 使用Iterable接口和Iterator接口实现迭…...
【计算机网络笔记】Internet网络的网络层——IP协议之IP数据报的结构
系列文章目录 什么是计算机网络? 什么是网络协议? 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能(1)——速率、带宽、延迟 计算机网络性能(2)…...
【Git】Git的GUI图形化工具ssh协议IDEA集成Git
一、GIT的GUI图形化工具 1、介绍 Git自带的GUI工具,主界面中各个按钮的意思基本与界面文字一致,与git的命令差别不大。在了解自己所做的操作情况下,各个功能点开看下就知道是怎么操作的。即使不了解,只要不做push操作,…...
Java中抽象类
1 抽象方法必须包含在抽象类中 package charactor; public abstract class Hero { String name; float hp;float armor;int moveSpeed;public static void main(String[] args) {}// 抽象方法attack // Hero的子类会被要求实现attack方法 public abstract void attack();} …...
18 Linux 阻塞和非阻塞 IO
一、阻塞和非阻塞 IO 1. 阻塞和非阻塞简介 这里的 IO 指 Input/Output(输入/输出),是应用程序对驱动设备的输入/输出操作。当应用程序对设备驱动进行操作的时候,如果不能获取到设备资源,那么阻塞式 IO 就会将对应应用…...
多因素验证如何让企业邮箱系统登录更安全?
企业邮箱系统作为基础的办公软件之一,既是企业内外沟通的重要工具,也是连接企业多个办公平台的桥梁,往往涉及到客户隐私、业务信息、企业机密等等。为了保护邮箱账户的安全,设置登陆密码无疑是保护账户安全的常用措施之一。然而随…...
投票助手图文音视频礼物打赏流量主小程序开源版开发
投票助手图文音视频礼物打赏流量主小程序开源版开发 图文投票:用户可以发布图文投票,选择相应的选项进行投票。 音视频投票:用户可以发布音视频投票,观看音视频后选择相应的选项进行投票。 礼物打赏:用户可以在投票过…...
黑客(网络安全)技术——高效自学1.0
前言 前几天发布了一篇 网络安全(黑客)自学 没想到收到了许多人的私信想要学习网安黑客技术!却不知道从哪里开始学起!怎么学 今天给大家分享一下,很多人上来就说想学习黑客,但是连方向都没搞清楚就开始学习…...
8255 boot介绍及bring up经验分享
这篇文章会简单的介绍8255的启动流程,然后着重介绍8255在实际项目中新硬件上的bring up工作,可以给大家做些参考。 8255 boot介绍 下面这些信息来自文档:《QAM8255P IVI Boot and CoreBSP Architecture Technical Overview》 80-42847-11 R…...
visual studio 启用DPI识别功能
在开发widow程序时,有时必须将电脑 设置-->显示-->缩放与布局-->更改文本、应用项目的大小-->100%后,程序的画面才能正确运行,居说这是锁定了dpi的原因,需要启dpi识别功能。设置方法如下: 或者...
一题三解(暴力、二分查找算法、单指针):鸡蛋掉落
涉及知识点 暴力、二分查找算法、单指针 题目 给你 k 枚相同的鸡蛋,并可以使用一栋从第 1 层到第 n 层共有 n 层楼的建筑。 已知存在楼层 f ,满足 0 < f < n ,任何从 高于 f 的楼层落下的鸡蛋都会碎,从 f 楼层或比它低的…...
第一章 Object-XML 映射简介
文章目录 第一章 Object-XML 映射简介基础如何工作的映射选项IRIS 中的相关工具XML 文档的可能应用 第一章 Object-XML 映射简介 基础 将对象映射到 XML 一词意味着定义如何将该对象用作 XML 文档。要将对象映射到 XML,请将 %XML.Adaptor 添加到定义该对象的类的超…...
精密设备企业适合哪款CRM客户管理体系?
精密设备企业致力于打造现代化管理体系,以精密的仪器、精细的销售、精准的市场、精确的售后为企业核心,提供优质的精密产品和专业服务。随着企业的发展及市场发展需要,建立高效的客户关系管理体系势在必行。那么,精密设备企业适合…...
Rasa-笔记
1 Rasa环境搭建 笔者使用的Rasa版本是古早的1.10.7,python环境3.7。 1、安装miniconda 2、conda创建python3.7环境 3、安装TensorFlow和GPU相关 4、安装Rasa相关 2 Rasa笔记 3 Rasa报错 3.1 ValueError: Can’t patch loop of type <class ‘uvloop.Loop’&g…...
云架构师学习------腾讯云通识-存储与数据库
云架构师学习------腾讯云通识-存储与数据库 云架构师学习------腾讯云通识-存储与数据库存储基础存储服务对象存储-COS产品概述功能概览产品优势 云硬盘-CBS产品概述产品功能产品优势云硬盘类型 文件存储-CFS产品概述产品功能产品优势文件存储类型及性能规格存储类型性能与规格…...
蓝桥杯之模拟与枚举day1
Question1卡片(C/CA组第一题) 这个是一道简单的模拟枚举题目,只要把对应每次的i的各个位都提取出来,然后对应的卡片数目减去1即可。属于打卡题目。注意for循环的特殊使用即可 #include <iostream> using namespace std; bool solve(int a[],int n…...
深度学习 python opencv 动物识别与检测 计算机竞赛
文章目录 0 前言1 深度学习实现动物识别与检测2 卷积神经网络2.1卷积层2.2 池化层2.3 激活函数2.4 全连接层2.5 使用tensorflow中keras模块实现卷积神经网络 3 YOLOV53.1 网络架构图3.2 输入端3.3 基准网络3.4 Neck网络3.5 Head输出层 4 数据集准备4.1 数据标注简介4.2 数据保存…...
爱家房产网站源码 爱家房产网商业版 微信互动营销整合+手机触屏版+经纪人分销
房产网站源码手机访问自动转手机版修改修复如下: 1,修复手机版首页标题头部名称 2,修复手机版首页频道导航按钮 3,新增手机版广告位置显示方式 4,修复手机版首页内容显示样式 5,手机版头部背景颜色ic…...
招聘信息采集
首先,我们需要使用PHP的curl库来发送HTTP请求。以下是一个基本的示例: <?php // 初始化curl $ch curl_init();// 设置代理 curl_setopt($ch, CURLOPT_PROXY, "jshk.com.cn");// 设置URL curl_setopt($ch, CURLOPT_URL, "http://www…...
java开发宝典
Java命名规范 1:代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束。 反例:_name / __name / $name / name_ / name$ / name__ 。 2:禁止使用拼音和英文混合。 反例:DaZhePromotion [打折] / …...
linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...
基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...
【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...
CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
Redis数据倾斜问题解决
Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...
