Java编程之迭代器模式(Iterator Pattern)

引言:

走进图书馆,你站在一排书架前,想要浏览书籍。你会一格格地从左到右翻阅书籍,而不是去研究书架是什么。
一本书一本书地翻,才知道书架上藏了什么书,研究书架的构造是不知道书籍的内容的。
这种“逐本访问,但不关心内部结构”的方式,正是迭代器模式所解决的问题。

一、什么是迭代器模式

迭代器模式(Iterator Pattern)是一种行为型设计模式,它用于顺序访问一个聚合对象(如集合、数组、列表等)中的元素,而不暴露其内部实现结构。

如同在图书馆看书,你只需一格一格地取书,不必关心书架内部是怎么存放书的。

二、模式结构与角色分工

我们以 Java 中模拟的“书架 BookShelf”为例,来理解迭代器模式的标准结构:

结构角色:

角色作用说明
Iterator定义遍历行为接口,如 hasNext()next()
ConcreteIterator实现具体的遍历逻辑
Aggregate表示可被遍历的聚合容器
ConcreteAggregate实现具体容器,如 BookShelf
Client客户端,使用迭代器来遍历聚合对象

三、UML 类图(PlantUML)

如下为UML结构图:

在这里插入图片描述

四、完整 Java 示例:

实现一个支持迭代的“书架”,来实现书架与书的迭代器。

定义迭代器接口

public interface Iterator<T> {boolean hasNext();T next();
}

定义聚合接口

public interface Aggregate<T> {Iterator<T> createIterator();
}

实体类:书 Book

public class Book {private final String name;public Book(String name) {this.name = name;}public String getName() {return name;}
}

聚合类:书架 BookShelf

public class BookShelf implements Aggregate<Book> {private final Book[] books;private int last = 0;public BookShelf(int maxSize) {books = new Book[maxSize];}public void appendBook(Book book) {books[last++] = book;}public Book getBookAt(int index) {return books[index];}public int getLength() {return last;}@Overridepublic Iterator<Book> createIterator() {return new BookShelfIterator(this);}
}

具体迭代器:BookShelfIterator

public class BookShelfIterator implements Iterator<Book> {private final BookShelf bookShelf;private int index = 0;public BookShelfIterator(BookShelf bookShelf) {this.bookShelf = bookShelf;}@Overridepublic boolean hasNext() {return index < bookShelf.getLength();}@Overridepublic Book next() {return bookShelf.getBookAt(index++);}
}

客户端使用示例

public class Main {public static void main(String[] args) {BookShelf shelf = new BookShelf(5);shelf.appendBook(new Book("Java 入门"));shelf.appendBook(new Book("设计模式"));shelf.appendBook(new Book("数据结构"));Iterator<Book> iterator = shelf.createIterator();while (iterator.hasNext()) {System.out.println(iterator.next().getName());}}
}

五、优点与适用场景

优点

迭代器模式的 5 大优势

优点点名详细说明
封装遍历逻辑遍历算法被封装在 Iterator 中,不暴露集合内部结构(如数组、链表),提高封装性和模块化。
统一遍历接口客户端代码只需依赖统一的 hasNext() + next() 接口,遍历不同类型集合(数组、列表、集合)方式一致,降低学习和使用成本。
解耦数据与操作将“存储数据”与“遍历行为”解耦,使集合可以专注于数据存储,迭代器专注于遍历策略。可独立扩展遍历方式,而不破坏集合类结构。
支持多种遍历策略可以扩展出不同的迭代器实现,如:
正向遍历
反向遍历
跳步遍历(隔一个取一个)
过滤遍历(如只遍历奇数)
组合结构遍历利器在树形结构、图结构、目录结构(如菜单、文件系统)中,也能借助迭代器实现统一的访问方式,特别适合组合模式联合使用。

适用场景详解

应用情境举例说明
不想暴露集合内部结构比如使用数组或链表实现的容器,客户端不应访问 books[i]nextNode,而只应通过迭代器获取元素。
希望集合类与遍历逻辑解耦当你需要根据数据源切换不同存储实现时(比如数组 ➜ 链表 ➜ 栈),客户端代码不应受影响,只需提供新的迭代器实现。
有多种遍历需求时如:分页展示(一次显示10条)、筛选遍历(只显示评分大于4的书)、逆序浏览等。
需要统一接口处理不同容器你希望能一套逻辑遍历多个不同集合对象(如 List、Set、自定义容器),通过统一接口提高代码复用性。
希望组合结构对象支持遍历在文件目录、组织架构树、菜单栏中,想要统一地“层层展开浏览”,迭代器是组合模式的理想搭档。
开发脚本解释器、编译器语言处理器中常常要遍历语法树(AST),语法元素集合可以通过迭代器统一访问,提高程序可扩展性。

六、在JDK 的使用

Java 中的 java.util.Iterator 就是这个模式的原生体现:

List<String> list = new ArrayList<>();
list.add("A");
list.add("B");Iterator<String> it = list.iterator();
while (it.hasNext()) {System.out.println(it.next());
}

只需要关注 元素如何一个个访问,而不关心其他因素。

总结

项目内容
模式名称迭代器模式(Iterator Pattern)
类型行为型模式
典型用途遍历集合,不暴露内部结构
Java 支持java.util.Iterator 接口
类比说明一本本地翻阅图书馆书架上的书

参考

《23种设计模式概览》
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/912108.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/912108.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ARM64 linux系统的一般执行过程

1、正在运行的用户进程X 2、发生异常&#xff08;包括系统调用等&#xff09;&#xff0c;CPU完成的工作&#xff1a;把当前程序指针寄存器PC放入ELR_EL1寄存器&#xff0c;把PSTATE放入SPSR_EL1寄存器&#xff0c;把异常产生的原因放在ESR_EL1寄存器&#xff0c;将异常向量表…

Vue3+ element 实现导入导出

一、导入功能相关代码分析 相关变量定义 importVisible&#xff1a;这是一个ref类型的响应式变量&#xff0c;用于控制导入对话框的显示与隐藏&#xff0c;初始值为false。当用户点击 “导入” 按钮时&#xff0c;会尝试将其值设为true来显示导入对话框&#xff0c;若出现异常则…

Git安装(纯小白版)

一、Git安装 1. 简介 Git是一款免费开源的分布式版本控制系统&#xff0c;常用于软件开发。它能记录文件在不同时间的改动&#xff0c;让用户在需要时查看、恢复旧版本。支持多人协作开发&#xff0c;多人可同时修改项目文件&#xff0c;Git会处理好冲突。开发者能在本地创建…

cocos2 本地根据文本内容生成二维码

cocos2 本地根据文本内容生成二维码 之前做了一个功能&#xff0c;就是cocos2小游戏&#xff0c;结算页面需要有一个二维码&#xff0c;二维码内容是一个网址&#xff0c;这个网址需要根据用户游玩分数确定访问哪个网址&#xff0c;但是这个小游戏是单机小游戏&#xff0c;不连…

87.xilinx FPGA读取器件id方法

dout数据高位先出msb module chip_id_reader(input clk,input reset,output [56:0] dna_value,output dna_valid );reg [6:0] bit_count;reg [56:0] dna_shift_reg;reg dna_read;reg dna_shift;wire dna_out;// 实例化DNA_PORT原语DNA_PORT #(.SIM_DNA_VALUE(57h123456789ABCD…

AcWing--数据结构(二)

Trie 树 用来高效的快速存储和查找字符串集合的数据结构 如存储&#xff1a;abcdef,abdef,aced,... 从根节点开始存储&#xff0c;从前往后存储&#xff0c;看是否有a&#xff0c;没有就创建&#xff0c;依次存储。 一般在最后一个字符打个标记&#xff0c;意思就是当前字符…

论基于架构的软件设计方法(ABSD)及应用

2025年3月22日作 题目 基于架构的软件设计&#xff08;Architecture-Based Software Design, ABSD&#xff09;方法以构成软件架构的商业、质量和功能需求等要素来驱动整个软件开发过程。ABSD是一个自顶向下&#xff0c;递归细化的软件开发方法&#xff0c;它以软件系统功能的…

【Docker基础】Docker容器管理:docker exec详解

目录 1 docker exec命令概述 1.1 命令定位与作用 1.2 与相似命令对比 2 基本语法与参数解析 2.1 完整命令语法 2.2 核心参数详解 2.2.1 -i, --interactive 2.2.2 -t, --tty 2.2.3 -d, --detach 2.2.4 -e, --env 2.2.5 -u, --user 2.2.6 -w, --workdir 3 典型使用场…

CSS3实现同心圆效果

效果图&#xff1a; 文本左侧显示一个 外圆&#xff08;30px&#xff0c;半透明&#xff09; 和 内圆&#xff08;12px&#xff0c;实色&#xff09; 的同心圆&#xff1a; <!DOCTYPE html> <html> <head><style>.text-with-circles {position: rela…

Spring Boot项目开发实战销售管理系统——系统设计!

Spring Boot项目开发实战——销售管理系统 在前面的章节中我们详细介绍了Spring Boot各个功能的使用&#xff0c;本章将新建一个销售管理系统项目&#xff0c;演示项目从需求分析到功能分解&#xff0c;再到各个功能的实现过程&#xff0c;最后再使用Docker部署上线的完整过程…

RK3588开发笔记-Hailo AI模块调试

目录 前言 一、RK3588 与 Hailo AI 模块简介 RK3588 Hailo AI 模块 二、原理图连接 三、内核配置 四、Hailo驱动编译 五、Hailo模块验证 总结 前言 在边缘计算和人工智能应用不断发展的今天,将高性能的 AI 模块与功能强大的开发板相结合,能为各种创新应用提供坚实的基…

【Pytorch】语言模型上的动态量化

目录 ■导言 ①定义模型 ②加载文本数据 ③加载预训练模型 ④测试动态量化 ■结论 ■导言 量化涉及将模型的权重和激活从float转换为int&#xff0c;这可以导致更小的模型大小和更快的推理&#xff0c;并且只对准确性造成很小的影响。 本文将把最简单的量化形式-动态量…

【有啥问啥】大模型效率部署之Prefill-Decode分离

大模型效率部署之Prefill-Decode分离 Prefill 与 Decode 阶段定义与流程 LLM 推理分为两个阶段&#xff1a;预填充&#xff08;Prefill&#xff09;和解码&#xff08;Decode&#xff09;。在 Prefill 阶段&#xff0c;模型将完整地处理用户输入的所有提示词&#xff08;prom…

QT Creator构建失败:-1: error: Unknown module(s) in QT: serialport

Qt Creator和Qt SDK版本&#xff1a; Product: Qt Creator 17.0.0 Based on: Qt 6.9.1 (MSVC 2022, x86_64) Built on: Jun 17 2025 16:32:24 From revision: 4983f08c47 问题&#xff1a; 在使用串口的时候&#xff0c;在pro 文件中添加了 QT serialport&#xff…

基于PostgreSQL的百度或高德等POI多层级分类的数据库设计

目录 前言 一、百度 VS 高德 POI分类 1、高德POI分类 2、百度POI分类 3、分类对比与区别 二、POI分类表设计 1、物理表结构 2、数据存储 3、数据查询 三、总结 前言 在当今数字化快速发展的时代&#xff0c;地理信息数据的重要性日益凸显&#xff0c;而POI&#xff08…

AutoVLA:端到端自动驾驶中具有自适应推理和强化微调功能的视觉-语言-动作模型

26年6月来自UCLA的论文“AutoVLA: A Vision-Language-Action Model for End-to-End Autonomous Driving with Adaptive Reasoning and Reinforcement Fine-Tuning”。 视觉-语言-动作 (VLA) 模型的最新进展通过利用世界知识和推理能力为端到端自动驾驶带来了希望。然而&#x…

知攻善防靶机 Windows 近源OS

知攻善防靶机 [hvv训练]应急响应靶机训练-近源渗透OS-1 前景需要&#xff1a;小王从某安全大厂被优化掉后&#xff0c;来到了某私立小学当起了计算机老师。某一天上课的时候&#xff0c;发现鼠标在自己动弹&#xff0c;又发现除了某台电脑&#xff0c;其他电脑连不上网络。感觉…

「Java基本语法」求三位整数的各位数字之和

引言 现在来玩一个数字拆解游戏。想象一下手里拿着一个三位数的积木,现在需要把它拆成个位、十位和百位三块,然后把它们加起来。这个操作在实际编程中很常见,例如做密码校验、游戏分数计算等都可能会用到。 案例:求三位数各位之和 编写程序,从键盘输入一个三位的正整数…

SciChart 助力蛋白质结构研究:实时可视化推动生物科学新突破

SciChart是高性能数据可视化领域的优秀图表产品&#xff0c;深受数据密度和精度至关重要行业的信赖&#xff0c;包括航空航天、石油和天然气、科学研究和赛车运动等。作为F1中使用的解决方案&#xff0c;SciChart被NASA所依赖&#xff0c;并受到90%的顶级医疗技术公司青睐&…

基于Docker与cpolar的Leantime部署方案实现低成本跨地域团队协作

文章目录 前言1.关于Leantime2.本地部署Leantime3.Leantime简单实用4.安装内网穿透5.配置Leantime公网地址6. 配置固定公网地址 前言 各位小伙伴们&#xff0c;让我们暂时把目光从云端的分布式系统转向本地环境。在您的Linux主机上&#xff0c;我们将搭建一个高性价比的协作平…