设计模式-14-迭代器模式
经典的设计模式有23种,但是常用的设计模式一般情况下不会到一半,我们就针对一些常用的设计模式进行一些详细的讲解和分析,方便大家更加容易理解和使用设计模式。
1-原理和实现
迭代器模式(Iterator Design Pattern),也叫作游标模式(Cursor Design Pattern)。它用来遍历集合对象。这里说的“集合对象”也可以叫“容器”“聚合对象”,实际上就是包含一组对象的对象,比如数组、链表、树、图、跳表。迭代器模式将集合对象的遍历操作从集合类中拆分出来,放到迭代器类中,让两者的职责更加单一。
迭代器是用来遍历容器的,所以,一个完整的迭代器模式一般会涉及容器和容器迭代器两部分内容。为了达到基于接口而非实现编程的目的,容器又包含容器接口、容器实现类,迭代器又包含迭代器接口、迭代器实现类。容器中需要定义iterator()方法,用来创建迭代器。迭代器接口中需要定义hasNext()、currentItem()、next()三个最基本的方法。容器对象通过依赖注入传递到迭代器类中。
我们看下java里面迭代器的设计:
public interface Iterator<E> {//只粘贴核心方法boolean hasNext();E next();}//ArrayList内部类
private class Itr implements Iterator<E> {int cursor; // index of next element to returnint lastRet = -1; // index of last element returned; -1 if no suchint expectedModCount = modCount;Itr() {}public boolean hasNext() {return cursor != size;}@SuppressWarnings("unchecked")public E next() {checkForComodification();int i = cursor;if (i >= size)throw new NoSuchElementException();Object[] elementData = ArrayList.this.elementData;if (i >= elementData.length)throw new ConcurrentModificationException();cursor = i + 1;return (E) elementData[lastRet = i];}}@Slf4j
public class IteratorTest {public static void main(String[] args) {List<String> list=new ArrayList<>();list.add("hello");list.add("world");list.add("java");Iterator<String> iterator = list.iterator();while(iterator.hasNext()){log.info(iterator.next());}}}
2-迭代器模式的优势
一般来讲,遍历集合数据有三种方法:for循环、foreach循环、iterator迭代器。
@Slf4j
public class IteratorTest {public static void main(String[] args) {List<String> list=new ArrayList<>();list.add("hello");list.add("world");list.add("java");// 第一种遍历方式:for循环for (int i = 0; i < list.size(); i++) {log.info(list.get(i));}log.info("*****************************");// 第二种遍历方式:foreach循环for (String str : list) {log.info(str);}log.info("*****************************");// 第三种遍历方式:迭代器遍历Iterator<String> iterator = list.iterator();while(iterator.hasNext()){log.info(iterator.next());}}}
foreach循环只是一个语法糖而已,底层是基于迭代器来实现的。也就是说,上面代码中的第二种遍历方式(foreach循环代码)的底层实现,就是第三种遍历方式(迭代器遍历代码)。这两种遍历方式可以看作同一种遍历方式,也就是迭代器遍历方式。从上面的代码来看,for循环遍历方式比起迭代器遍历方式,代码看起来更加简洁。那我们为什么还要用迭代器来遍历容器呢?为什么还要给容器设计对应的迭代器呢?
迭代器模式封装集合内部的复杂数据结构,开发者不需要了解如何遍历,直接使用容器提供的迭代器即可;
迭代器模式将集合对象的遍历操作从集合类中拆分出来,放到迭代器类中,让两者的职责更加单一;
迭代器模式让添加新的遍历算法更加容易,更符合开闭原则。除此之外,因为迭代器都实现自相同的接口,在开发中,基于接口而非实现编程,替换迭代器也变得更加容易。
相关文章:
设计模式-14-迭代器模式
经典的设计模式有23种,但是常用的设计模式一般情况下不会到一半,我们就针对一些常用的设计模式进行一些详细的讲解和分析,方便大家更加容易理解和使用设计模式。 1-原理和实现 迭代器模式(Iterator Design Pattern)&a…...
防雷接地+防雷工程施工综合方案
一、地凯科技防雷工程接地概述 防雷接地工程是指在建筑物或其他设施上安装防雷装置,以防止雷电对人员、设备和建筑物造成危害的工程。防雷装置主要包括避雷针(网)、引下线、接地体(网)等部分,其中接地体&a…...
排序算法--选择排序
实现逻辑 ① 第一轮从下标为 1 到下标为 n-1 的元素中选取最小值,若小于第一个数,则交换 ② 第二轮从下标为 2 到下标为 n-1 的元素中选取最小值,若小于第二个数,则交换 ③ 依次类推下去…… void print_array(int a[], int n){f…...
【Web】Ctfshow SSRF刷题记录1
核心代码解读 <?php $url$_POST[url]; $chcurl_init($url); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $resultcurl_exec($ch); curl_close($ch); ?> curl_init():初始curl会话 curl_setopt():会…...
【算法挨揍日记】day30——300. 最长递增子序列、376. 摆动序列
300. 最长递增子序列 300. 最长递增子序列 题目解析: 给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如&#…...
ROS2对比ROS1的一些变化与优势(全新安装ROS2以及编译错误处理)《1》
1、概述 我们在前面介绍的ROS,都是ROS1的版本,近期对机器狗进行学习的时候,发现版本是ROS2了,也发现平时习惯的一些命令都有了变化,改变还是挺大的,不过熟悉之后还是很习惯ROS2的写法。 ROS2不是在ROS1的基…...
基于单片机PM2.5监测系统仿真设计
**单片机设计介绍, 基于单片机PM2.5监测系统仿真设计 文章目录 一 概要简介设计目标系统组成工作流程仿真设计结论 二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 # 基于单片机PM2.5监测系统仿真设计介绍 简介 PM2.5(可吸…...
CRM系统中的联系人是什么?如何进行联系人管理?
上手CRM系统前掌握专业术语是必要的功课,在第一次使用CRM系统时小编和大家一样,分不清楚线索、联系人、客户、商机之间的关系,今天我们就来着重分享一下CRM中联系人是什么?如何进行联系人管理? CRM系统联系人是指能够…...
uniapp:如何实现点击图片可以全屏展示预览
这个需要使用uniapp中的api:uni.previewImage,使用方法如下 1、html <template><view><image src"图片路径" click"preview"></image></view> </template> 2、JavaScript <script> e…...
python运行hhsearch二进制命令的包装器类
hhsearch 是 HMM-HMM(Hidden Markov Model to Hidden Markov Model)比对方法的一部分,属于 HMMER 软件套件。它用于进行蛋白质序列的高效比对,特别适用于检测远缘同源性。 以下是 hhsearch 的一些主要特点和用途: HMM…...
Java 网络编程、e-mail、多线程编程
一、Java 网络编程: 网络编程时指编写运行在多个设备的程序,这些设备通过网络连接起来。 Java.net包中的J2SE的API包含有类和接口,提供低层次的通信细节。 java.net 包中提供了两种常见的网络协议的支持: TCP:TCP&…...
为虚幻引擎开发者准备的Unity指南
目录 1.前言2.编辑器2.1 Scene 视图(视口)2.2 Game 视图 (Play in Editor)2.3.Hierarchy 窗口 (World Outliner)2.4 Project 窗口(Content Browser)2.5 Inspector (Details)2.6 Console(消息视图/输出日志)2.7 Modes 面板在哪里&a…...
Vue 2使用element ui 表格不显示
直接修改package.json文件 把这两个依赖修改成对应的 删除node_modules 重新安装依赖 重启...
C++学习 --文件
文件操作步骤: 1, 包含头文件#include<fstream> 2, 创建流对象:ofstream ofs 3, 打开文件:ofs.open("文件路径", 打开方式) 4, 写数据:ofs <<…...
java/Android:将字符串按数量分割
分割成数组 import java.util.Arrays;/*** Java将字符串按照指定长度分割成字符串数组*/ public class StringUtils {public static void main(String[] args){String data "227d77a7a244c7b2be3180f2d46be352f56ddf92866692f2cac797358097e5a3e90f6d20bb96bc516a4ab9c0…...
JVM 监控命令详解
文章目录 JDK 中与常用命令行工具jpsjstatjinfojmap导出 dump 文件查看堆内存信息 jstack JVM 可视化分析工具 JDK 中与常用命令行工具 jps 查看当前服务器正在执行的 Java 进程 $> jps 7584 Application 16433 AdminApplication 14209 Jps 5813 Bootstrap 5575 TestApplic…...
TEE威胁评分与评级
目录 一、攻击潜力 1.1 攻击潜力网格 1、实际经过的时间: 2、访问TOE(目标设备)...
-bash: ./deploy.sh: /bin/bash^M: bad interpreter: No such file or directory
文章目录 场景解决 场景 jenkins 发布失败, 报错ERROR: Exception when publishing, exception message [Exec exit status not zero. Status [126]], 这说明远程服务器的deploy.sh执行失败, 首先检查权限,没有发现问题,然后手动执行一遍又报错"-ba…...
【文末送书】十大排序算法C++代码实现
欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和技术。关…...
vue-waterfall2 实现瀑布流,及总结的问题
注意:引入需要在主界面引入,直接在组件中引用会有问题 1.安装 npm install vue-waterfall21.8.20 --save (提示:一定要安装1.8.20,最新版会有一部分问题) 2.打开main.js文件 import waterfall from v…...
M-LLM 赋能高效视频理解:基于帧选择的优化策略深度解析
随着短视频平台的蓬勃发展,视频数据的爆炸式增长给视频理解带来了巨大的挑战。传统的视频理解方法往往需要处理大量的视频帧,计算成本高昂。为了解决这个问题,研究人员提出了基于 M-LLM (Multimodal Large Language Model) 的视频帧选择策略&…...
KrkrzExtract终极指南:新一代krkrz引擎资源解包工具完全解析
KrkrzExtract终极指南:新一代krkrz引擎资源解包工具完全解析 【免费下载链接】KrkrzExtract The next generation of KrkrExtract 项目地址: https://gitcode.com/gh_mirrors/kr/KrkrzExtract KrkrzExtract是专门为krkrz引擎设计的下一代资源处理工具&#x…...
第9章:从直播到录播——知识产品的矩阵化运营 /《程序员AI时代实现 直播知识付费实现月入100万的落地详细实战方案》
第9章:从直播到录播——知识产品的矩阵化运营 如果说到前面那些章节,我更像是把直播当成卖时间的主动收入事业来做的话,从这一章开始,我想给你看一个更加根本的跃迁逻辑。一场直播卖得好,你赚数字的绝对值是靠每一分钟…...
数字电源控制技术:从效率优化到智能管理
1. 数字电源控制技术的革新突破在电力电子领域工作了十五年,我见证了电源技术从模拟控制到数字控制的革命性转变。2007年那场PCIM China展会上,Ericsson展示的数字控制POL稳压器让我至今记忆犹新——它用25.412.7mm的尺寸实现了20A输出,这个尺…...
Windows PDF处理终极指南:Poppler预编译包零配置解决方案
Windows PDF处理终极指南:Poppler预编译包零配置解决方案 【免费下载链接】poppler-windows Download Poppler binaries packaged for Windows with dependencies 项目地址: https://gitcode.com/gh_mirrors/po/poppler-windows 还在为Windows上的PDF处理工具…...
Driver Store Explorer:3步快速清理Windows驱动垃圾,释放数十GB磁盘空间终极指南
Driver Store Explorer:3步快速清理Windows驱动垃圾,释放数十GB磁盘空间终极指南 【免费下载链接】DriverStoreExplorer Driver Store Explorer 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer 你是否经常发现Windows系统盘空…...
告别硬字幕烦恼!5分钟学会用AI智能工具无损去除视频字幕
告别硬字幕烦恼!5分钟学会用AI智能工具无损去除视频字幕 【免费下载链接】video-subtitle-remover 基于AI的图片/视频硬字幕去除、文本水印去除,无损分辨率生成去字幕、去水印后的图片/视频文件。无需申请第三方API,本地实现。AI-based tool …...
go语言:实现ShorAlgorithm肖尔算法(附带源码)
一、项目背景详细介绍Shor 算法由 Peter Shor 在 1994 年提出,是量子计算的里程碑算法。1. 它解决什么问题?👉 大整数分解问题(Integer Factorization)例如:N 15 → 3 5 N 21 → 3 7 N 91 → 7 132. …...
别再死磕C#了!用PDMS自带的PML语言,5分钟搞定你的第一个二次开发脚本
别再死磕C#了!用PDMS自带的PML语言,5分钟搞定你的第一个二次开发脚本 在工程设计与建模领域,PDMS(Plant Design Management System)作为主流的三维工厂设计软件,其强大的定制化能力常被低估。许多工程师面对…...
如何彻底解决ComfyUI节点冲突:5种策略完整指南
如何彻底解决ComfyUI节点冲突:5种策略完整指南 【免费下载链接】ComfyUI-Manager ComfyUI-Manager is an extension designed to enhance the usability of ComfyUI. It offers management functions to install, remove, disable, and enable various custom nodes…...
