二十三种设计模式全面解析-解密迭代器模式:探索遍历之道
在软件开发中,遍历数据集合是一个非常常见的需求。但是,如何以一种优雅、灵活的方式遍历集合,并且能够适应各种不同的数据结构和迭代方式,一直是开发者们面临的挑战。今天,我将带你深入探索迭代器模式(Iterator Pattern),一种强大的设计模式,它不仅能够解决遍历问题,还能提供更多的灵活性和可扩展性。让我们一起揭开迭代器模式的神秘面纱!
1、什么是迭代器模式?
迭代器模式是一种行为型设计模式,通过提供一个统一的接口来遍历集合中的元素,而不需要暴露底层集合的内部结构。
它将遍历算法与数据结构解耦,使得我们可以独立地修改它们,而不会相互影响。
迭代器模式的核心思想是将遍历操作委托给迭代器对象,通过迭代器对象来控制遍历过程。
2、迭代器模式适用场景
迭代器模式适用于以下情况:
- 当你需要遍历一个复杂的数据结构,并且不想暴露其内部实现细节时。
- 当你希望提供多种遍历方式,例如正序、逆序等。
- 当你希望能够在不同的数据结构上使用相同的遍历算法。
3、迭代器模式的技术点
-
定义迭代器接口:迭代器接口定义了遍历集合的方法,包括获取下一个元素、判断是否还有元素等。
-
实现具体迭代器:具体迭代器实现了迭代器接口,并且持有对应的数据结构,实现了具体的遍历算法。
-
抽象集合类:抽象集合类定义了获取迭代器的方法,具体集合类继承该抽象类并实现获取自身迭代器的方法。
-
客户端使用迭代器:客户端通过调用迭代器的方法来遍历集合,无需关注底层集合的具体实现。
4、案例代码
假设我们有一个名为 ArrayList
的自定义列表类,我们希望能够通过迭代器遍历其中的元素。以下是一个简单的迭代器模式的案例代码:
// 迭代器接口
interface Iterator<T> {boolean hasNext();T next();
}// 抽象集合类
interface List<T> {Iterator<T> createIterator();int size();T get(int index);
}// 具体迭代器
class ArrayListIterator<T> implements Iterator<T> {private List<T> list;private int index;public ArrayListIterator(List<T> list) {this.list = list;this.index = 0;}public boolean hasNext() {return index < list.size();}public T next() {if (hasNext()) {T element = list.get(index);index++;return element;}return null;}
}// 具体集合类
class ArrayList<T> implements List<T> {private T[] elements;private int size;public ArrayList() {this.elements = (T[]) new Object[10];this.size = 0;}public void add(T element) {elements[size] = element;size++;}public T get(int index) {if (index >= 0 && index < size) {return elements[index];}return null;}public int size() {return size;}public Iterator<T> createIterator() {return new ArrayListIterator<>(this);}
}// 客户端代码
public class IteratorPatternDemo {public static void main(String[] args) {ArrayList<String> names = new ArrayList<>();names.add("Alice");names.add("Bob");names.add("Charlie");Iterator<String> iterator = names.createIterator();while (iterator.hasNext()) {String name = iterator.next();System.out.println(name);}}
}
以上代码中,我们定义了迭代器接口 Iterator
,抽象集合类 List
,具体迭代器 ArrayListIterator
和具体集合类 ArrayList
。在客户端代码中,我们使用 ArrayList
创建了一个字符串列表,并通过迭代器遍历输出了列表中的元素。
这个示例展示了如何使用迭代器模式来遍历一个自定义的列表类,而无需了解列表内部的实现细节。通过迭代器,我们可以轻松地遍历集合,并且可以在不修改集合类的情况下添加新的遍历方式。
总结:
迭代器模式为我们提供了一种优雅的方式来遍历数据集合,它将遍历算法与数据结构解耦,使得我们能够更加灵活地操作和扩展。在实际的软件开发中,迭代器模式广泛应用于各种场景,如集合类、数据库查询结果的遍历等。然而,迭代器模式还有更多的变体和扩展,例如双向迭代器、内部迭代器等,它们进一步提供了更多的遍历方式和功能。
下一篇博文中,我们将深入探讨迭代器模式的变体和进阶应用,带来更多精彩的内容和案例。敬请期待!
相关文章:
二十三种设计模式全面解析-解密迭代器模式:探索遍历之道
在软件开发中,遍历数据集合是一个非常常见的需求。但是,如何以一种优雅、灵活的方式遍历集合,并且能够适应各种不同的数据结构和迭代方式,一直是开发者们面临的挑战。今天,我将带你深入探索迭代器模式(Iter…...

kubernetes istio
目录 一、部署 二、部署示例应用 三、部署遥测组件 四、流量管理 五、熔断 官网:https://istio.io/latest/zh/about/service-mesh/ 一、部署 提前准备好文件 tar zxf 15t10-1.19.3-linux-amd64.tar.gz cd 15t10-1.19.3/ export PATH$PWD/bin:$PATHistioctl install …...

25期代码随想录算法训练营第十四天 | 二叉树 | 递归遍历、迭代遍历
目录 递归遍历前序遍历中序遍历后序遍历 迭代遍历前序遍历中序遍历后序遍历 递归遍历 前序遍历 # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightNone): # self.val val # self.left left # …...
常用布局以及其优缺点
当涉及到设计和排版时,有许多不同的布局方式可供选择。以下是几种常见的布局方式以及它们的优缺点: 流式布局(Fluid Layout): 优点:能够根据屏幕大小自动调整内容,适应不同设备。灵活性高&#…...

海康工业相机如何提高相机帧率
影响帧率的因素 相机参数 帧率限制使能 像素格式 曝光时间 数据包大小(网口) 相机默认参数 ADC位深 系统环境设置...

Linux之IPC通信共享内存(一次拷贝)与消息队列、管道、信号量、socket(两次拷贝)总结(六十二)
简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生…...

【多线程 - 01、概述】
进程 几乎所有的操作系统都支持进程概念,进程是处于运行过程中的程序,进程是操作系统中进行资源分配的基本单位。 三个基本特征 独立性:指进程实体是一个能独立运行、独立获得资源和独立接受调度的基本单位。而对于未建立任何进程的程序&…...

SQL SELECT INTO 语句
SQL SELECT INTO 语句 使用 SQL,您可以将信息从一个表中复制到另一个表中。 SELECT INTO 语句从一个表中复制数据,然后将数据插入到另一个新表中。 SQL SELECT INTO 语法 我们可以把所有的列都复制到新表中: SELECT * INTO newtable [IN ex…...
【刷题】(AtCoder Beginner Contest 328) C、D 补题
前言 第一次打 a了两道 C、D都是TLE 看了其他人的题解之后 有一些想法 所以发一篇博客 C 题干 题目链接 我的思路及做题过程 我的思路是 输入left、right 再在这个区间内计算字母相同的对数 代码是: #include<iostream> #include<cmath> #includ…...

NI USRP软件无线设备的特点
NI USRP软件无线设备 NI的USRP(Universal Software Radio Peripheral)设备是RF应用中使用的软件无线(SDR)。NI的USRP收发器可以在多个频段发送和接收RF信号,因此可用于通信工程教育和研究。通过与LabVIEW开发环境相结合,USRP可以实现使用无线信号验证无…...

大数据毕业设计选题推荐-污水处理大数据平台-Hadoop-Spark-Hive
✨作者主页:IT研究室✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…...
最新获取支付宝cardIndex参数图文教程
本章教程主要介绍如何获取支付宝的cardIndex参数。 目录 一、登录到支付宝官网 二、在历史记录中,找到对应用户 一、登录到支付宝官网...

Linux学习第二枪(yum,vim,g++/gcc,makefile的使用)
前言:在我的上一篇Linux博客我已经讲了基础指令和权限,现在我们来学习如何在Linux上运行和执行代码 目录 一,yum 二,vim 1)命令行模式 2)插入模式 3)底行模式 三,gcc/g 四&a…...

自然语言处理(一):RNN
「循环神经网络」(Recurrent Neural Network,RNN)是一个非常经典的面向序列的模型,可以对自然语言句子或是其他时序信号进行建模。进一步讲,它只有一个物理RNN单元,但是这个RNN单元可以按照时间步骤进行展开…...

超全总结!大模型算法面试指南(含答案)
大家好,从 2019 年的谷歌 T5 到 OpenAI GPT 系列,参数量爆炸的大模型不断涌现。可以说,LLMs 的研究在学界和业界都得到了很大的推进,尤其去年 11 月底对话大模型 ChatGPT 的出现更是引起了社会各界的广泛关注。 近些年࿰…...
前端使用C-lodop 实现循环套打小案例
目录 前言引入js文件小案例 前言 lodop是一个很优秀打印插件,具体的大家可以官网了解,先在官网下载插件,安装在本地,并启动,点击官网下载 引入js文件 //本JS是加载Lodop插件或Web打印服务CLodop/Lodop7的综合示例&a…...

基于SpringBoot+Vue+mysql卓越导师双选系统设计与实现
博主介绍:✌Csdn特邀作者、博客专家、博客云专家、B站程序阿龙带小白做毕设系列,项目讲解、B站粉丝排行榜前列、专注于Java技术领域和毕业项目实战✌ 系统说明简介: 如今的信息时代,对信息的共享性,信息的流通性有着较…...

Windows 11系统cmd终端美化、Vscode终端美化
win11美化cmd终端和vscode的终端 1. 修改终端背景2. oh-my-posh2.1 安装oh-my-posh2.2 安装Clink2.3 Clink配置oh-my-posh2.4 下载和配置Nerd字体2.5 修改美化主题 3. vscode终端美化 电脑默认的终端没有语法高亮这些,运行命令和代码输出字体一样,有时会…...

[游戏中的图形学实时渲染技术] Part1 实时阴影技术
原理篇: 常见的渲染方程如下: 在不考虑自发光项与考虑阴影对于着色结果的影响之后可以将方程变化为如下形式: 如果射线在到达光源前击中了其他物体时,就认为这条来自光源的光线对着色点没有贡献。 利用上述渲染方程进行正确的着…...

NtripShare Mos地铁自动化监测终端盒子硬件设计
自动化监测产品到目前为止做了接近一年,在软件层面上,控制终端软件、平台软件、网平差算法都已解决,硬件盒子始终是心里过不去的坎,最终还是没有耐住性子自己做了一把。 选型如下: 1、主板:瑞芯微RK3568主板。 2、外…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

前端导出带有合并单元格的列表
// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...
五年级数学知识边界总结思考-下册
目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...
【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)
要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况,可以通过以下几种方式模拟或触发: 1. 增加CPU负载 运行大量计算密集型任务,例如: 使用多线程循环执行复杂计算(如数学运算、加密解密等)。运行图…...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...

算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...

基于SpringBoot在线拍卖系统的设计和实现
摘 要 随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统,主要的模块包括管理员;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...