迭代器模式简介
概念:
迭代器模式是一种行为型设计模式,它提供了一种访问集合对象元素的方法,而无需暴露其内部表示。通过使用迭代器,可以按照特定顺序遍历集合中的元素。
特点:
- 将遍历和具体集合分离,使得能够独立地改变集合的实现方式。
- 提供了一个统一的接口来访问不同类型的集合对象。
- 隐藏了对于底层数据结构和算法的细节。
优点:
- 简化了客户端代码,将遍历逻辑从业务逻辑中解耦出来。
- 提供了对不同类型集合对象进行统一操作的能力。
- 支持多种遍历方式。
缺点:
- 对于某些复杂数据结构或算法可能需要自定义迭代器实现,增加了开发成本和复杂性。
- 在某些情况下可能会导致额外内存消耗。
适用场景:
- 当需要以相同方式遍历不同类型(如数组、链表、树等)的集合对象时可以使用迭代器模式。
- 当希望隐藏底层数据结构并提供一个统一接口来访问元素时可以使用迭代器模式。
实现方式:
内部迭代器:
在集合对象内部定义一个迭代器类,由集合对象主动调用迭代器的方法进行遍历。
实现原理:
- 集合类中包含一个迭代器类并实现含获取迭代器的方法。
- 迭代器类实现一个接口或抽象类,其中包含判断是否有下一个元素和获取下一个元素的方法。
- 在具体集合类中定义一个私有内部类作为具体的迭代器实现,并在该内部类中实现相关方法。
实现代码:
// 这里假设我们有一个名为MyCollection的具体集合类import java.util.ArrayList;
import java.util.List;class MyCollection<T> {private List<T> elements;public MyCollection() {this.elements = new ArrayList<>();}public void add(T element) {elements.add(element);}// 获取内部迭代器public Iterator<T> getIterator() {return new ConcreteIterator();}// 具体迭代器类,实现了Iterator接口private class ConcreteIterator implements Iterator<T> {private int index;@Overridepublic boolean hasNext() {return index < elements.size();}@Overridepublic T next() {if (this.hasNext()) {return elements.get(index++);}return null;}}
}// 定义一个迭代器接口
interface Iterator<T> {boolean hasNext();T next();
}public class Main {public static void main(String[] args) {
// 使用示例MyCollection<String> collection = new MyCollection<>();collection.add("A");collection.add("B");collection.add("C");// 获取内部迭代器并遍历集合元素Iterator<String> iterator = collection.getIterator();while (iterator.hasNext()) {String element = iterator.next();System.out.println(element);}}
}
在上述示例中,我们创建了一个具体集合类 MyCollection ,其中包含一个私有内部类 ConcreteIterator 实现了迭代器接口。
在具体集合类中定义的 getIterator() 方法返回该内部迭代器对象。客户端代码可以通过调用该方法获取到具体集合的内部迭代器,并使用循环遍历输出每个元素。在实际应用中,还可以根据需要对内部迭代器进行扩展,例如添加过滤条件、排序等操作。
存在的问题:
- 内部迭代器无法同时处理多个不同类型的集合对象。
- 内部迭代器无法灵活地改变遍历顺序或跳过特定元素。
- 集合对象对于每个元素都要进行完整遍历操作,如果只需要访问某些特定元素可能会造成性能损失。
外部迭代器:
客户端代码通过调用外部的迭代器来遍历集合对象。在外部迭代器中,客户端代码通过手动调用迭代器的方法来遍历集合对象,并可以灵活地控制遍历顺序和跳过特定元素。
实现原理:
- 在具体集合类中提供一个返回该迭代器对象的方法。
- 迭代器可以是自己创建的也可以使用java内置的迭代器。
- 在客户端代码中手动调用迭代器的方法进行遍历操作。
实现代码:
// 这里假设我们有一个名为MyCollection的具体集合类import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;class MyCollection<T> {private List<T> elements;public MyCollection() {this.elements = new ArrayList<>();}public void add(T element) {elements.add(element);}// 获取内部迭代器public Iterator<T> getIterator() {return elements.iterator();}
}public class Main {public static void main(String[] args) {
// 使用示例MyCollection<String> collection = new MyCollection<>();collection.add("A");collection.add("B");collection.add("C");// 获取外部迭代器并遍历集合元素Iterator<String> iterator = collection.getIterator();while (iterator.hasNext()) {String element = iterator.next();System.out.println(element);}}
}
在上述示例中,我们创建了一个具体集合类 MyCollection ,其中的 getIterator() 方法返回了Java内置的迭代器对象。
在客户端代码中,我们通过调用具体集合的 getIterator() 方法获取到外部迭代器,并使用循环遍历输出每个元素。在实际应用中,可以根据需要使用不同类型的外部迭代器,例如自定义实现一个针对特定需求进行封装的外部迭代器类。这样可以灵活地控制遍历逻辑和提供额外功能。
相关文章:
迭代器模式简介
概念: 迭代器模式是一种行为型设计模式,它提供了一种访问集合对象元素的方法,而无需暴露其内部表示。通过使用迭代器,可以按照特定顺序遍历集合中的元素。 特点: 将遍历和具体集合分离,使得能够独立地改…...
四方定理c++题解
题目描述 四方定理是数论中著名的一个定理,指任意一个自然数都可以拆成四个自然数的平方之和。例如: 251^22^22^24^2 对 25来说,还有其他方案: 250^20^23^24^2 以及 250^20^20^25^2 给定一个自然数 n ,请输出 n…...
ZDH-权限模块
本次介绍基于ZDH v5.1.2版本 目录 项目源码 预览地址 安装包下载地址 ZDH权限模块 ZDH权限模块-重要名词划分 ZDH权限模块-菜单管理 ZDH权限模块-角色管理 ZDH权限模块-用户配置 ZDH权限模块-权限申请 项目源码 zdh_web: GitHub - zhaoyachao/zdh_web: 大数据采集,抽…...
漏洞修复:在应用程序中发现不必要的 Http 响应头
描述 blablabla描述,一般是在返回的响应表头中出现了Server键值对,那我们要做的就是移除它,解决方案中提供了nginx的解决方案 解决方案 第一种解决方案 当前解决方案会隐藏nginx的版本号,但还是会返回nginx字样,如…...
什么是mkp勒索病毒,中了mkp勒索病毒怎么办?勒索病毒解密数据恢复
mkp勒索病毒是一种新兴的计算机木马病毒,它以加密文件的方式进行勒索,对用户的计算机安全造成了严重威胁。本文将介绍mkp勒索病毒的特征、影响以及应对措施,以便读者更好地了解和防范这种病毒。 一、mkp勒索病毒的特征 加密文件:…...
db2迁移至oracle
1.思路 (1)用java连接数据库(2)把DB2数据导出为通用的格式如csv,json等(3)导入其他数据库,比如oracle,mongodb。这个方法自由发挥的空间比较大。朋友说他会用springboot…...
webpack学习使用
...
按钮控件之2---QComboBox 复选按钮/复选框控件
1、常用函数: comboBox->addItem("cxq"); //添加下拉选项 combobox->clear(); //清空下拉项comboBox->setCurrentIndex(0);//设置当前的索引 int currentlndex(): //返回当前项的序号,第一个项的序号…...
【数据分享】2006-2021年我国省份级别的燃气相关指标(免费获取\20多项指标)
《中国城市建设统计年鉴》中细致地统计了我国城市市政公用设施建设与发展情况,在之前的文章中,我们分享过基于2006-2021年《中国城市建设统计年鉴》整理的2006—2021年我国省份级别的市政设施水平相关指标、2006-2021年我国省份级别的各类建设用地面积数…...
C语言深入理解指针(非常详细)(二)
目录 指针运算指针-整数指针-指针指针的关系运算 野指针野指针成因指针未初始化指针越界访问指针指向的空间释放 如何规避野指针指针初始化注意指针越界指针不使用时就用NULL避免返回局部变量的地址 assert断言指针的使用和传址调用传址调用例子(strlen函数的实现&a…...
Web3j 继承StaticStruct的类所有属性必须为Public <DynamicArray<StaticStruct>>
Web3j 继承StaticStruct的类所有属性必须为Public,属性的顺序和数量必须和solidity 里面的struct 属性相同,否则属性少了或者多了的时候会出现错位 Web3j 继承StaticStruct的类所有属性不能为private,因为web3j 是通过长度去截取返回值解析成…...
Kubernetes(k8s)上安装Prometheus和Grafana监控
Kubernetes上安装Prometheus和Grafana监控 环境准备Kubernetes准备 安装项目开始安装下载安装的项目安装项目替换镜像替换kube-state-metrics替换prometheus-adapter 修改Service修改alertmanager-service.yaml修改grafana-service.yaml修改prometheus-service.yaml 执行这些ya…...
黑马 软件测试从0到1 常用分类 模型 流程 用例
课程内容: 1、软件测试基础 2、测试设计 3、缺陷管理 4、Web常用标签 5、项目实战 以终为始,由交付实战目标为终,推出所学知识;从认识软件及软件测试,到如何设计测试、缺陷标准及缺陷管理,最终以项目实战贯…...
面试中的商业思维:如何展示你对业务的理解
🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…...
Docker切换文件系统为VFS
一、介绍 Docker支持AUFS、Btrfs、Device Mapper、OverlayFS、VFS、ZFS六种不同的存储驱动。 1. AUFS AUFS是一种常见的存储驱动程序,它也使用了Linux内核的AUFS文件系统。它的优点是支持所有的Linux发行版,可以在不同的容器之间共享文件系统…...
Spring Security存在认证绕过漏洞 CVE-2021-22096
文章目录 0.前言1.参考文档2.基础介绍漏洞影响范围:官方说明:修复版本:漏洞利用步骤:修复方式: 3.解决方案 0.前言 背景:项目被扫到Spring Boot 的漏洞,严格的说应该是Spring Security 组件的漏…...
前端list列表自定义图标并设置大小
前端list列表自定义图标并设置大小 一、前端list列表基础知识回顾 前端公有两种列表,一种是有序列表(ol),一种是无序列表(ul),它们的子元素都是(li)。 1.1 有序列表&a…...
Multisim14.0仿真(五)三角波发生器
一、仿真原理图: 二、仿真效果:...
使用安全复制命令scp在Windows系统和Linux系统之间相互传输文件
现在已经有很多远程控制服务器的第三方软件平台,比如FinalShell,MobaXterm等,半可视化界面,使用起来非常方便和友好,两个系统之间传输文件直接拖就行,当然也可以使用命令方式在两个系统之间相互传递。 目录…...
SOC总线学习记录之ICB(Internal Chip Bus)
蜂鸟E203总线: 采用自定义总线协议 ICB(Internal Chip Bus),该总线用于蜂鸟 E203 内核内部使用,同时也可作为 SoC 中的总线使用。 ICB 总线的初衷是为了能够尽可能地结合 AXI 总线和 AHB 总线的优点,兼具高…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...
c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...
智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制
在数字化浪潮席卷全球的今天,数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具,在大规模数据获取中发挥着关键作用。然而,传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时,常出现数据质…...
Docker 本地安装 mysql 数据库
Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker ;并安装。 基础操作不再赘述。 打开 macOS 终端,开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...
Chrome 浏览器前端与客户端双向通信实战
Chrome 前端(即页面 JS / Web UI)与客户端(C 后端)的交互机制,是 Chromium 架构中非常核心的一环。下面我将按常见场景,从通道、流程、技术栈几个角度做一套完整的分析,特别适合你这种在分析和改…...
学习一下用鸿蒙DevEco Studio HarmonyOS5实现百度地图
在鸿蒙(HarmonyOS5)中集成百度地图,可以通过以下步骤和技术方案实现。结合鸿蒙的分布式能力和百度地图的API,可以构建跨设备的定位、导航和地图展示功能。 1. 鸿蒙环境准备 开发工具:下载安装 De…...
全面解析数据库:从基础概念到前沿应用
在数字化时代,数据已成为企业和社会发展的核心资产,而数据库作为存储、管理和处理数据的关键工具,在各个领域发挥着举足轻重的作用。从电商平台的商品信息管理,到社交网络的用户数据存储,再到金融行业的交易记录处理&a…...
