迭代器模式 (Iterator Pattern)
文章目录
- 迭代器模式 (Iterator Pattern)
- 原理
- 优点
- 缺点
- 示例代码
- 场景描述
- 1. 定义迭代器接口
- 2. 定义集合接口
- 3. 实现具体集合类
- 4. 客户端代码
- 输出结果
- UML 类图
- 使用场景
- 优化与扩展
- 小结
迭代器模式 (Iterator Pattern)
迭代器模式是一种 行为型设计模式,用于顺序访问集合对象中的元素,而无需暴露集合的内部表示。它提供了一种统一的方式来遍历不同类型的集合。
原理
- 核心思想:
- 将集合的遍历逻辑封装在迭代器对象中,分离集合对象的存储和迭代行为。
- 适用场景:
- 需要访问集合对象中的内容,而不希望暴露其内部结构。
- 需要以不同方式遍历集合。
- 提供一个统一接口,支持多种类型集合的迭代。
- 参与角色:
- Iterator(迭代器接口):
- 定义访问和遍历元素的方法。
- ConcreteIterator(具体迭代器):
- 实现迭代器接口,负责具体的遍历行为。
- Aggregate(集合接口):
- 定义创建迭代器的接口。
- ConcreteAggregate(具体集合):
- 实现集合接口,并返回具体的迭代器。
- Iterator(迭代器接口):
优点
- 单一职责原则:
- 集合类负责存储数据,迭代器负责遍历,分离了职责。
- 开放/封闭原则:
- 可以新增不同的迭代方式,而无需修改集合类。
- 统一接口:
- 不同集合的遍历方式对外统一。
缺点
- 开销:
- 如果集合很大,创建多个迭代器对象可能会增加内存开销。
- 访问限制:
- 某些高级操作(如随机访问)可能不适用于简单迭代器。
示例代码
场景描述
设计一个自定义集合类 CustomCollection,并提供一个迭代器来遍历其中的元素。
1. 定义迭代器接口
// 迭代器接口
public interface Iterator<T> {boolean hasNext(); // 是否还有下一个元素T next(); // 获取下一个元素
}
2. 定义集合接口
// 集合接口
public interface Aggregate<T> {Iterator<T> createIterator(); // 创建迭代器
}
3. 实现具体集合类
import java.util.ArrayList;
import java.util.List;// 具体集合类
public class CustomCollection<T> implements Aggregate<T> {private List<T> items = new ArrayList<>();// 添加元素public void add(T item) {items.add(item);}// 获取元素public T get(int index) {return items.get(index);}// 获取集合大小public int size() {return items.size();}// 创建迭代器@Overridepublic Iterator<T> createIterator() {return new CustomIterator();}// 具体迭代器类private class CustomIterator implements Iterator<T> {private int index = 0; // 当前索引@Overridepublic boolean hasNext() {return index < items.size();}@Overridepublic T next() {return items.get(index++);}}
}
4. 客户端代码
public class IteratorPatternExample {public static void main(String[] args) {// 创建集合CustomCollection<String> collection = new CustomCollection<>();collection.add("Element 1");collection.add("Element 2");collection.add("Element 3");// 获取迭代器Iterator<String> iterator = collection.createIterator();// 使用迭代器遍历集合while (iterator.hasNext()) {System.out.println(iterator.next());}}
}
输出结果
Element 1
Element 2
Element 3
UML 类图
+----------------+| Aggregate |<-----------------++----------------+ || + createIterator(): Iterator<T> |+----------------+ |^ || |+---------------------------+ +-------------------+| CustomCollection<T> | | Iterator<T> |+---------------------------+ +-------------------+| - items : List<T> | | + hasNext(): bool || + add(item): void | | + next(): T || + createIterator(): CustomIterator<T> |+---------------------------+ +-------------------+^ ^| |+---------------------------+ +-------------------+| CustomIterator<T> | | Client |+---------------------------+ +-------------------+| - index : int | | + hasNext(): bool || + next(): T |+---------------------------+
使用场景
- 集合类的封装:
- 如 Java 中的
ArrayList,HashMap的迭代器。
- 如 Java 中的
- 多种遍历方式:
- 深度优先搜索和广度优先搜索可以使用不同的迭代器实现。
- 复杂对象的遍历:
- 需要以特定顺序访问复杂结构中的数据。
优化与扩展
- 支持多种遍历方式:
- 如反向迭代器、跳步迭代器等。
- 线程安全:
- 提供线程安全的迭代器(如
CopyOnWriteArrayList的迭代器)。
- 提供线程安全的迭代器(如
- 懒加载:
- 对于大集合,可以使用惰性迭代器按需加载数据。
小结
- 迭代器模式使得集合的遍历行为与集合内部结构解耦。
- 提供了统一的访问方式,但实现迭代器可能带来一定的额外开销。
- 在实际开发中,迭代器模式广泛应用于各种集合类的遍历操作,尤其是在框架设计中非常常见。
相关文章:
迭代器模式 (Iterator Pattern)
文章目录 迭代器模式 (Iterator Pattern)原理优点缺点示例代码场景描述1. 定义迭代器接口2. 定义集合接口3. 实现具体集合类4. 客户端代码输出结果 UML 类图使用场景优化与扩展小结 迭代器模式 (Iterator Pattern) 迭代器模式是一种 行为型设计模式,用于顺序访问集…...
039集——渐变色之:CAD中画彩虹()(CAD—C#二次开发入门)
(来左边儿 跟我一起画个龙,在你右边儿 画一道彩虹 ~~~~~~~~~~~ ) 效果如下: namespace AcTools {public class Class1{public Wform.Timer timer;//定时器需建在类下面public static DateTime startTime;[CommandM…...
如何将 GitHub 私有仓库(private)转换为公共仓库(public)
文章目录 如何将 GitHub 私有仓库转换为公共仓库步骤 1: 登录 GitHub步骤 2: 导航到目标仓库步骤 3: 访问仓库设置步骤 4: 更改仓库可见性步骤 5: 确认更改步骤 6: 验证更改注意事项 如何将 GitHub 私有仓库转换为公共仓库 在软件开发领域,GitHub 是一个广受欢迎的…...
C++11 右值引用
目录 左值 右值 左值引用与右值引用比较 左值引用总结: 右值引用总结: 左值引用的使用场景: 引用传参和做返回值都可以提高效率(减少拷贝) 左值引用的短板: 右值引用和移动语义解决上述问题: 下面就是有移动…...
WPS表格学习计划与策略
一、学习目标 掌握WPS表格的基本操作:包括新建、打开、保存工作簿,单元格的编辑与格式化,数据的输入与验证等。熟练运用WPS表格的数据处理功能:包括数据排序、筛选、分类汇总,以及使用公式和函数进行计算和分析。学会制作图表与数据可视化:掌握不同类型图表(如柱状图、折…...
Android 引入 proto 项目及使用方法
Proto(Protocol Buffers)是Google开发的一种语言无关、平台无关的序列化结构数据的方法,它类似于JSON和XML,但相对于XML而言更小,相对于JSON而言解析更快,支持多语言。以下是将Proto引入Android项目的方法及…...
VSOMEIP主要流程的时序
请求服务: client应用: application_impl::request_service routing_manager_client::request_service (老版本是routing_manager_proxy) routing_manager_client::send_request_services protocol::request_service_command its_command; // 创建…...
右值引用和移动语义:
C 右值引用和移动语义详解 在 C 的发展历程中,右值引用和移动语义的引入带来了显著的性能提升和编程灵活性。本文将深入探讨右值引用和移动语义的概念、用法以及重要性。 一、引言 C 作为一门高效的编程语言,一直在不断演进以满足现代软件编程的需求。…...
经纬高LLA转地心地固ECEF坐标,公式,代码
经纬高转地心地固的目的 坐标系转换是gis或者slam系统常见操作。GNSS获取的一般是经纬高,经纬高在slam系统里无法应用,slam系统一般是xyz互相垂直的笛卡尔坐标系,所以需要把GNSS的经纬高转到直角坐标系地心地固ECEF或者高斯投影GKP。 划重点…...
VUE前端实现天爱滑块验证码--详细教程
第一步: Git地址:tianai-captcha-demo: 滑块验证码demo 找到目录 src/main/resources/static,拷贝 static 并改名为 tac 即可。 第二步: 将改为 tac 的文件,放进项目根目录中,如下图: 第三步࿱…...
【链表】【删除节点】【刷题笔记】【灵神题单】
237.删除链表的节点 链表删除节点的本质是不用删除,只需要操作指针,跳过需要删除的节点,指向下下一个节点即可! 删除某个节点,但是不知道这个节点的前一个节点,也不知道头节点!摘自力扣评论区…...
springboot339javaweb的新能源充电系统pf(论文+源码)_kaic
毕 业 设 计(论 文) 题目:新能源充电系统的设计与实现 摘 要 如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离不开了互联网。新技术的产生,往往能解…...
【嵌入式——QT】QT制作安装包
第一步 QT程序写好之后,编译release版本 第二步 拿到release生成的.exe文件 第三步 新建文件夹deploy 第四步 将.exe文件复制到deploy目录下 第五步 在该目录下输入cmd指令,回车 第六步 在打开的命令窗口下输入 windeployqt TegNetCom_1.0.…...
python的文件操作练习
文件操作:成绩统计 有一个文件grades.txt,文件内容是每行一个学生的成绩(格式:姓名,成绩)。要求: 读取文件内容,统计所有学生的平均成绩; 将不及格(<60分)…...
jQuery九宫格抽奖,php处理抽奖信息
功能介绍 jQuery九宫格抽奖是一种基于jQuery库的前端抽奖效果。通过九宫格的形式展示抽奖项,用户点击抽奖按钮后,九宫格开始旋转,最终停在一个随机位置上,此位置对应的抽奖项为用户的中奖结果。 本文实现九宫格的步骤为…...
2024年一级建造师考试成绩,即将公布!
一级建造师考试成绩一般在考试结束后3个月左右的时间公布! 根据官方通知,重庆、江苏、青海、江西、云南、湖南、福建、北京、山西、黑龙江等地在今年一建报名通知里提到:2024年一级建造师考试成绩预计于2024年12月上旬公布。考生可在这个时间…...
M4V 视频是一种什么格式?如何把 M4V 转为 MP4 格式?
M4V 是一种视频文件格式,主要由苹果公司用于其产品和服务中,如 iTunes Store 上的电影和电视节目。这种格式可以包含受版权保护的内容,并且通常与苹果的 DRM(数字版权管理)技术结合使用,以限制内容的复制和…...
Leetcode 每日一题 104.二叉树的最大深度
目录 问题描述 示例 示例 1: 示例 2: 约束条件 题解 方法一:广度优先搜索(BFS) 步骤 代码实现 方法二:递归 步骤 代码实现 结论 问题描述 给定一个二叉树 root,我们需要返回其最大…...
文件上传漏洞:你的网站安全吗?
文章目录 文件上传漏洞攻击方式:0x01绕过前端限制0x02黑名单绕过1.特殊解析后缀绕过2..htaccess解析绕过3.大小写绕过4.点绕过5.空格绕过6.::$DATA绕过7.配合中间件解析漏洞8.双后缀名绕过9.短标签绕过 0x03白名单绕过1.MIME绕过(Content-Type绕过)2.%00截断3.0x00截…...
AWS账号提额
Lightsail提额 控制台右上角,用户名点开,选择Service Quotas 在导航栏中AWS服务中找到lightsail点进去 在搜索框搜索instance找到相应的实例类型申请配额 4.根据自己的需求选择要提额的地区 5.根据需求来提升配额数量,提升小额配额等大约1小时生效 Ligh…...
【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...
微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...
3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...
HarmonyOS运动开发:如何用mpchart绘制运动配速图表
##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...
深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用
文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么?1.1.2 感知机的工作原理 1.2 感知机的简单应用:基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...
Bean 作用域有哪些?如何答出技术深度?
导语: Spring 面试绕不开 Bean 的作用域问题,这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开,结合典型面试题及实战场景,帮你厘清重点,打破模板式回答,…...
认识CMake并使用CMake构建自己的第一个项目
1.CMake的作用和优势 跨平台支持:CMake支持多种操作系统和编译器,使用同一份构建配置可以在不同的环境中使用 简化配置:通过CMakeLists.txt文件,用户可以定义项目结构、依赖项、编译选项等,无需手动编写复杂的构建脚本…...
