二十三种设计模式全面解析-解密迭代器模式:探索遍历之道
在软件开发中,遍历数据集合是一个非常常见的需求。但是,如何以一种优雅、灵活的方式遍历集合,并且能够适应各种不同的数据结构和迭代方式,一直是开发者们面临的挑战。今天,我将带你深入探索迭代器模式(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、外…...
19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...
python打卡day49
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...
工程地质软件市场:发展现状、趋势与策略建议
一、引言 在工程建设领域,准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具,正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...
Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...
现代密码学 | 椭圆曲线密码学—附py代码
Elliptic Curve Cryptography 椭圆曲线密码学(ECC)是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础,例如椭圆曲线数字签…...
2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...
现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?
现有的 Redis 分布式锁库(如 Redisson)相比于开发者自己基于 Redis 命令(如 SETNX, EXPIRE, DEL)手动实现分布式锁,提供了巨大的便利性和健壮性。主要体现在以下几个方面: 原子性保证 (Atomicity)ÿ…...
