当前位置: 首页 > news >正文

迭代器模式 (Iterator Pattern)

文章目录

      • 迭代器模式 (Iterator Pattern)
      • 原理
      • 优点
      • 缺点
      • 示例代码
        • 场景描述
        • 1. 定义迭代器接口
        • 2. 定义集合接口
        • 3. 实现具体集合类
        • 4. 客户端代码
        • 输出结果
      • UML 类图
      • 使用场景
      • 优化与扩展
      • 小结

迭代器模式 (Iterator Pattern)

迭代器模式是一种 行为型设计模式,用于顺序访问集合对象中的元素,而无需暴露集合的内部表示。它提供了一种统一的方式来遍历不同类型的集合。


原理

  1. 核心思想
    • 将集合的遍历逻辑封装在迭代器对象中,分离集合对象的存储和迭代行为。
  2. 适用场景
    • 需要访问集合对象中的内容,而不希望暴露其内部结构。
    • 需要以不同方式遍历集合。
    • 提供一个统一接口,支持多种类型集合的迭代。
  3. 参与角色
    • Iterator(迭代器接口)
      • 定义访问和遍历元素的方法。
    • ConcreteIterator(具体迭代器)
      • 实现迭代器接口,负责具体的遍历行为。
    • Aggregate(集合接口)
      • 定义创建迭代器的接口。
    • ConcreteAggregate(具体集合)
      • 实现集合接口,并返回具体的迭代器。

优点

  1. 单一职责原则
    • 集合类负责存储数据,迭代器负责遍历,分离了职责。
  2. 开放/封闭原则
    • 可以新增不同的迭代方式,而无需修改集合类。
  3. 统一接口
    • 不同集合的遍历方式对外统一。

缺点

  1. 开销
    • 如果集合很大,创建多个迭代器对象可能会增加内存开销。
  2. 访问限制
    • 某些高级操作(如随机访问)可能不适用于简单迭代器。

示例代码

场景描述

设计一个自定义集合类 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               |+---------------------------+

使用场景

  1. 集合类的封装
    • 如 Java 中的 ArrayList, HashMap 的迭代器。
  2. 多种遍历方式
    • 深度优先搜索和广度优先搜索可以使用不同的迭代器实现。
  3. 复杂对象的遍历
    • 需要以特定顺序访问复杂结构中的数据。

优化与扩展

  1. 支持多种遍历方式
    • 如反向迭代器、跳步迭代器等。
  2. 线程安全
    • 提供线程安全的迭代器(如 CopyOnWriteArrayList 的迭代器)。
  3. 懒加载
    • 对于大集合,可以使用惰性迭代器按需加载数据。

小结

  • 迭代器模式使得集合的遍历行为与集合内部结构解耦。
  • 提供了统一的访问方式,但实现迭代器可能带来一定的额外开销。
  • 在实际开发中,迭代器模式广泛应用于各种集合类的遍历操作,尤其是在框架设计中非常常见。

相关文章:

迭代器模式 (Iterator Pattern)

文章目录 迭代器模式 (Iterator Pattern)原理优点缺点示例代码场景描述1. 定义迭代器接口2. 定义集合接口3. 实现具体集合类4. 客户端代码输出结果 UML 类图使用场景优化与扩展小结 迭代器模式 (Iterator Pattern) 迭代器模式是一种 行为型设计模式&#xff0c;用于顺序访问集…...

039集——渐变色之:CAD中画彩虹()(CAD—C#二次开发入门)

&#xff08;来左边儿 跟我一起画个龙&#xff0c;在你右边儿 画一道彩虹 ~~~~~~~~~~~ &#xff09; 效果如下&#xff1a; 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 私有仓库转换为公共仓库 在软件开发领域&#xff0c;GitHub 是一个广受欢迎的…...

C++11 右值引用

目录 左值 右值 左值引用与右值引用比较 左值引用总结&#xff1a; 右值引用总结&#xff1a; 左值引用的使用场景&#xff1a; 引用传参和做返回值都可以提高效率(减少拷贝) 左值引用的短板&#xff1a; 右值引用和移动语义解决上述问题&#xff1a; 下面就是有移动…...

WPS表格学习计划与策略

一、学习目标 掌握WPS表格的基本操作:包括新建、打开、保存工作簿,单元格的编辑与格式化,数据的输入与验证等。熟练运用WPS表格的数据处理功能:包括数据排序、筛选、分类汇总,以及使用公式和函数进行计算和分析。学会制作图表与数据可视化:掌握不同类型图表(如柱状图、折…...

Android 引入 proto 项目及使用方法

Proto&#xff08;Protocol Buffers&#xff09;是Google开发的一种语言无关、平台无关的序列化结构数据的方法&#xff0c;它类似于JSON和XML&#xff0c;但相对于XML而言更小&#xff0c;相对于JSON而言解析更快&#xff0c;支持多语言。以下是将Proto引入Android项目的方法及…...

VSOMEIP主要流程的时序

请求服务: client应用&#xff1a; ​ 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 的发展历程中&#xff0c;右值引用和移动语义的引入带来了显著的性能提升和编程灵活性。本文将深入探讨右值引用和移动语义的概念、用法以及重要性。 一、引言 C 作为一门高效的编程语言&#xff0c;一直在不断演进以满足现代软件编程的需求。…...

经纬高LLA转地心地固ECEF坐标,公式,代码

经纬高转地心地固的目的 坐标系转换是gis或者slam系统常见操作。GNSS获取的一般是经纬高&#xff0c;经纬高在slam系统里无法应用&#xff0c;slam系统一般是xyz互相垂直的笛卡尔坐标系&#xff0c;所以需要把GNSS的经纬高转到直角坐标系地心地固ECEF或者高斯投影GKP。 划重点…...

VUE前端实现天爱滑块验证码--详细教程

第一步&#xff1a; Git地址&#xff1a;tianai-captcha-demo: 滑块验证码demo 找到目录 src/main/resources/static,拷贝 static 并改名为 tac 即可。 第二步&#xff1a; 将改为 tac 的文件&#xff0c;放进项目根目录中&#xff0c;如下图&#xff1a; 第三步&#xff1…...

【链表】【删除节点】【刷题笔记】【灵神题单】

237.删除链表的节点 链表删除节点的本质是不用删除&#xff0c;只需要操作指针&#xff0c;跳过需要删除的节点&#xff0c;指向下下一个节点即可&#xff01; 删除某个节点&#xff0c;但是不知道这个节点的前一个节点&#xff0c;也不知道头节点&#xff01;摘自力扣评论区…...

springboot339javaweb的新能源充电系统pf(论文+源码)_kaic

毕 业 设 计&#xff08;论 文&#xff09; 题目&#xff1a;新能源充电系统的设计与实现 摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解…...

【嵌入式——QT】QT制作安装包

第一步 QT程序写好之后&#xff0c;编译release版本 第二步 拿到release生成的.exe文件 第三步 新建文件夹deploy 第四步 将.exe文件复制到deploy目录下 第五步 在该目录下输入cmd指令&#xff0c;回车 第六步 在打开的命令窗口下输入 windeployqt TegNetCom_1.0.…...

python的文件操作练习

文件操作&#xff1a;成绩统计 有一个文件grades.txt&#xff0c;文件内容是每行一个学生的成绩&#xff08;格式&#xff1a;姓名,成绩&#xff09;。要求&#xff1a; 读取文件内容&#xff0c;统计所有学生的平均成绩&#xff1b; 将不及格&#xff08;<60分&#xff09…...

jQuery九宫格抽奖,php处理抽奖信息

功能介绍 jQuery九宫格抽奖是一种基于jQuery库的前端抽奖效果。通过九宫格的形式展示抽奖项&#xff0c;用户点击抽奖按钮后&#xff0c;九宫格开始旋转&#xff0c;最终停在一个随机位置上&#xff0c;此位置对应的抽奖项为用户的中奖结果。 本文实现九宫格的步骤为&#xf…...

2024年一级建造师考试成绩,即将公布!

一级建造师考试成绩一般在考试结束后3个月左右的时间公布&#xff01; 根据官方通知&#xff0c;重庆、江苏、青海、江西、云南、湖南、福建、北京、山西、黑龙江等地在今年一建报名通知里提到&#xff1a;2024年一级建造师考试成绩预计于2024年12月上旬公布。考生可在这个时间…...

M4V 视频是一种什么格式?如何把 M4V 转为 MP4 格式?

M4V 是一种视频文件格式&#xff0c;主要由苹果公司用于其产品和服务中&#xff0c;如 iTunes Store 上的电影和电视节目。这种格式可以包含受版权保护的内容&#xff0c;并且通常与苹果的 DRM&#xff08;数字版权管理&#xff09;技术结合使用&#xff0c;以限制内容的复制和…...

Leetcode 每日一题 104.二叉树的最大深度

目录 问题描述 示例 示例 1&#xff1a; 示例 2&#xff1a; 约束条件 题解 方法一&#xff1a;广度优先搜索&#xff08;BFS&#xff09; 步骤 代码实现 方法二&#xff1a;递归 步骤 代码实现 结论 问题描述 给定一个二叉树 root&#xff0c;我们需要返回其最大…...

文件上传漏洞:你的网站安全吗?

文章目录 文件上传漏洞攻击方式&#xff1a;0x01绕过前端限制0x02黑名单绕过1.特殊解析后缀绕过2..htaccess解析绕过3.大小写绕过4.点绕过5.空格绕过6.::$DATA绕过7.配合中间件解析漏洞8.双后缀名绕过9.短标签绕过 0x03白名单绕过1.MIME绕过(Content-Type绕过)2.%00截断3.0x00截…...

AWS账号提额

Lightsail提额 控制台右上角&#xff0c;用户名点开&#xff0c;选择Service Quotas 在导航栏中AWS服务中找到lightsail点进去 在搜索框搜索instance找到相应的实例类型申请配额 4.根据自己的需求选择要提额的地区 5.根据需求来提升配额数量,提升小额配额等大约1小时生效 Ligh…...

Claude IDE工具集:让AI编程助手从代码生成到自主执行

1. 项目概述&#xff1a;一个为Claude设计的IDE工具集最近在折腾AI编程助手时&#xff0c;发现了一个挺有意思的项目——YousifAshwal/claude-ide-tools。这本质上是一个专门为Anthropic的Claude模型&#xff08;特别是Claude 3系列&#xff09;打造的集成开发环境工具集。简单…...

多智能体强化学习在物流分拣中的优化实践

1. 项目背景与核心挑战在复杂任务场景下&#xff0c;多智能体系统面临着信息不完整、环境动态变化和协作效率低下的三重挑战。去年我们在物流分拣机器人集群项目中就深刻体会到&#xff1a;当20台AGV同时运作时&#xff0c;传统基于固定规则的任务分配方式会导致30%以上的路径冲…...

从飞行员训练到个人能力体系:构建结构化技能成长框架

1. 项目概述&#xff1a;从“飞行员技能”到个人能力体系的构建最近在GitHub上看到一个挺有意思的项目&#xff0c;叫“pilot-skills”。初看标题&#xff0c;你可能会以为这是个飞行模拟游戏或者航空培训相关的仓库。但点进去才发现&#xff0c;它的核心并非关于驾驶飞机&…...

从零开始掌握BP神经网络:基于TensorFlow的回归与分类实战

一、前言&#xff1a;为什么要学BP神经网络&#xff1f;BP&#xff08;Back Propagation&#xff09;神经网络是深度学习的基石之一。无论你是刚入门机器学习&#xff0c;还是希望系统掌握神经网络的基本原理&#xff0c;BP神经网络都是一个绕不开的起点。它通过前向传播计算输…...

ESP32 Marauder 5G - Apex 5模块:无线安全研究的革新利器

1. ESP32 Marauder 5G - Apex 5模块深度解析作为Flipper Zero生态中最新推出的多功能射频模块&#xff0c;ESP32 Marauder 5G - Apex 5代表了当前开源硬件在无线安全研究领域的最高集成度。这款由HoneyHoneyTrading设计的扩展模块&#xff0c;通过ESP32-C5芯片实现了前所未有的…...

从伺服调试到IO控制:手把手教你用开源IGH EtherCAT主站库连接倍福模块

从伺服调试到IO控制&#xff1a;基于开源IGH EtherCAT主站的倍福模块实战指南 在工业自动化领域&#xff0c;EtherCAT凭借其卓越的实时性能和灵活的拓扑结构&#xff0c;已成为运动控制系统的首选协议。然而&#xff0c;商业解决方案如倍福TwinCAT往往价格昂贵&#xff0c;对预…...

PDUR路由基本功能

一、PduR路由基本功能概述   PduR&#xff08;PDU Router&#xff09;模块是AutoSAR架构通信协议栈的通用模块&#xff0c;也就是CAN、Lin、Eth、FlexRay等总线通信、诊断报文传输的时候都会经过PduR模块。 为什么需要PduR模块&#xff1a;   可以理解PduR作为一个软件中间…...

2026年免费视频文字提取工具对比:微信小程序vs桌面软件实操清单

做短视频内容的时候经常卡在几个问题上&#xff1a;录好的素材怎么快速出文案、会议视频转录要花多少时间、链接视频能不能直接提取文字而不用下载。这些需求看似小&#xff0c;但如果工具选不对&#xff0c;能把整个制作流程拉长。我会先讲微信里有个叫提词匠的小程序在这类需…...

git worktree

文章目录1.简介2.格式3.常用选项4.示例4.1 为现有分支创建 worktree4.2 创建新分支并同时创建 worktree4.3 查看所有 worktree4.4 移除不再需要的 worktree4.5 锁定 worktree&#xff08;防止在 prune 时被清除&#xff09;4.6 清理已删除的 worktree 引用5.小结参考文献1.简介…...

【RT-DETR涨点改进】ICME 2026 |独家创新首发、注意力改进篇| 引入SFC显著特征校准模块,通过双分支门控与全局统计信息引导实现特征精细校准,含7种创新改进,助力遥感目标检测任务有效涨点

一、本文介绍 🔥本文给大家介绍使用 SFC显著特征校准模块 改进RT-DETR网络模型,对检测特征进行更细致的自适应校准,使模型在特征融合和预测阶段能够更加准确地突出目标区域、边界轮廓以及局部细节信息。由于SFC能够结合全局统计信息与局部响应,通过双分支门控方式动态调节…...