迭代器模式深度解析与实战案例

一、模式定义

迭代器模式(Iterator Pattern) 是一种行为设计模式,提供一种方法顺序访问聚合对象的元素,无需暴露其底层表示。核心思想是将遍历逻辑从聚合对象中分离,实现 遍历与存储的解耦。

二、核心组件

组件作用
Iterator定义遍历接口(hasNext/next)
ConcreteIterator实现具体集合的遍历逻辑
Aggregate聚合对象接口,定义创建迭代器的方法
ConcreteAggregate具体聚合对象,实现迭代器创建方法

三、模式优势

统一遍历接口:不同集合使用相同方式遍历
单一职责原则:分离集合管理与遍历算法
开闭原则:新增迭代器类型不影响现有代码
并行遍历:支持多个迭代器同时遍历集合

四、真实场景案例:社交网络关系遍历

场景需求
某社交平台需要实现:
用户关系包含 好友列表(数组存储)和 关注列表(链表存储)
需要统一接口遍历两种关系
支持 隐私过滤(不展示已注销用户)

五、Java实现代码

1. 迭代器接口

public interface RelationIterator<T> {boolean hasNext();T next();void remove();
}

2. 聚合对象接口

public interface SocialNetwork {RelationIterator<User> createIterator();RelationIterator<User> createActiveUserIterator(); // 扩展:过滤非活跃用户
}

3. 具体聚合对象实现

// 好友列表(数组存储)
class FriendList implements SocialNetwork {private User[] friends;private int size;public FriendList(int capacity) {friends = new User[capacity];}public void addFriend(User user) {if (size < friends.length) {friends[size++] = user;}}@Overridepublic RelationIterator<User> createIterator() {return new FriendListIterator();}@Overridepublic RelationIterator<User> createActiveUserIterator() {return new ActiveFriendListIterator();}// 具体迭代器实现(内部类)private class FriendListIterator implements RelationIterator<User> {private int position = 0;@Overridepublic boolean hasNext() {return position < size;}@Overridepublic User next() {if (!hasNext()) throw new NoSuchElementException();return friends[position++];}@Overridepublic void remove() {throw new UnsupportedOperationException();}}// 扩展:过滤非活跃用户private class ActiveFriendListIterator implements RelationIterator<User> {private int position = 0;@Overridepublic boolean hasNext() {skipInactiveUsers();return position < size;}@Overridepublic User next() {if (!hasNext()) throw new NoSuchElementException();return friends[position++];}private void skipInactiveUsers() {while (position < size && !friends[position].isActive()) {position++;}}}
}// 关注列表(链表存储)
class FollowingList implements SocialNetwork {private static class Node {User user;Node next;Node(User user) {this.user = user;}}private Node head;private Node tail;public void addFollowing(User user) {Node newNode = new Node(user);if (head == null) {head = tail = newNode;} else {tail.next = newNode;tail = newNode;}}@Overridepublic RelationIterator<User> createIterator() {return new FollowingListIterator();}// 具体迭代器实现(内部类)private class FollowingListIterator implements RelationIterator<User> {private Node current = head;@Overridepublic boolean hasNext() {return current != null;}@Overridepublic User next() {if (!hasNext()) throw new NoSuchElementException();User user = current.user;current = current.next;return user;}@Overridepublic void remove() {throw new UnsupportedOperationException();}}
}

4. 用户实体类

public class User {private final String id;private String name;private boolean active = true;public User(String id, String name) {this.id = id;this.name = name;}// Getters/Setterspublic boolean isActive() { return active; }public void deactivate() { active = false; }
}

5. 客户端使用

public class SocialNetworkClient {public static void main(String[] args) {// 初始化数据User user1 = new User("U001", "张三");User user2 = new User("U002", "李四");user2.deactivate();User user3 = new User("U003", "王五");// 构建好友列表FriendList friends = new FriendList(10);friends.addFriend(user1);friends.addFriend(user2);friends.addFriend(user3);// 构建关注列表FollowingList followings = new FollowingList();followings.addFollowing(user3);followings.addFollowing(user1);// 遍历好友列表(基础迭代器)System.out.println("=== 好友列表 ===");printRelations(friends.createIterator());// 遍历关注列表System.out.println("\n=== 关注列表 ===");printRelations(followings.createIterator());// 使用过滤迭代器System.out.println("\n=== 活跃好友 ===");printRelations(friends.createActiveUserIterator());}private static void printRelations(RelationIterator<User> iterator) {while (iterator.hasNext()) {User user = iterator.next();System.out.printf("%s (%s)%n", user.getName(), user.isActive() ? "活跃" : "已注销");}}
}

六、运行结果

=== 好友列表 ===
张三 (活跃)
李四 (已注销)
王五 (活跃)=== 关注列表 ===
王五 (活跃)
张三 (活跃)=== 活跃好友 ===
张三 (活跃)
王五 (活跃)

七、模式变体与优化

1. 多维度迭代
// 组合条件迭代器
public interface CompositeIterator<T> extends RelationIterator<T> {void addFilter(Predicate<T> filter);void sort(Comparator<T> comparator);
}// 使用示例
CompositeIterator<User> iterator = new SmartUserIterator();
iterator.addFilter(User::isVIP);
iterator.sort(Comparator.comparing(User::getJoinDate));
2. 线程安全实现
// 快照迭代器(避免ConcurrentModificationException)
public class SnapshotIterator<T> implements RelationIterator<T> {private final List<T> snapshot;private int position = 0;public SnapshotIterator(Collection<T> original) {this.snapshot = new ArrayList<>(original);}// 实现标准迭代器方法...
}

八、行业应用场景

场景具体应用优势体现
文件系统遍历递归遍历目录结构统一处理文件/文件夹
数据库查询结果集游标遍历处理海量数据内存优化
游戏物品系统背包不同分类物品遍历支持多种筛选条件
大数据处理分片数据顺序访问处理超出内存限制的数据
GUI组件树遍历窗口组件层级遍历支持深度优先/广度优先策略

九、最佳实践建议

迭代器生命周期管理
// 使用try-with-resources管理资源
try (RelationIterator<User> iterator = friends.createIterator()) {while (iterator.hasNext()) {// 处理逻辑}
}
空迭代器实现
// 空对象模式应用
public class EmptyIterator<T> implements RelationIterator<T> {@Override public boolean hasNext() { return false; }@Override public T next() { throw new NoSuchElementException(); }
}
性能优化技巧
// 预计算迭代路径(适用于树形结构)
public class PrecomputedTreeIterator<T> implements RelationIterator<T> {private final List<T> traversalPath;private int index = 0;public PrecomputedTreeIterator(TreeNode root) {this.traversalPath = preorderTraversal(root);}// 实现标准方法...
}

十、与相似模式对比

模式核心差异适用场景
迭代器专注集合遍历机制需要统一遍历接口的场景
访问者在遍历过程中执行操作对集合元素进行复杂操作
组合处理树形结构需要递归遍历的层级结构
工厂方法用于创建迭代器对象需要灵活创建不同类型迭代器

通过这个社交网络关系遍历的案例,可以看出迭代器模式如何 有效封装不同数据结构的遍历逻辑。在实际开发中,可根据需求扩展迭代器功能(如过滤、排序、分页等),同时保持客户端代码的简洁性。该模式特别适合需要支持多种数据存储方式且需要统一访问接口的系统架构。

一句话总结

迭代器模式是为了提供一种能顺序遍历对象的解决方案,该方案不对外暴露存储细节。

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

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

相关文章

SSH远程工具

一、常见SSH远程工具 工具开源跨平台多标签文件传输高级功能价格Xshell❌Win✔️✔️脚本、会话管理免费/商业版Tabby✔️全平台✔️✔️插件扩展免费MobaXterm❌Win✔️✔️集成工具集免费/付费SecureCRT❌Win/macOS/Linux✔️✔️企业级加密$129+PuTTY✔️全平台❌❌基础连接…

VUE中的路由处理

1.引入,预处理main.ts import {} from vue-router import { createRouter, createWebHistory } from vue-router import HomePages from @/pages/HomePages.vue import AboutPage from @/pages/AboutPage.vue import NewsPage from @/pages/NewsPage.vue //1. 配置路由规…

编程助手fitten code使用说明(超详细)(vscode)

这两年 AI 发展迅猛&#xff0c;作为开发人员&#xff0c;我们总是追求更快、更高效的工作方式&#xff0c;AI 的出现可以说改变了很多人的编程方式。 AI 对我们来说就是一个可靠的编程助手&#xff0c;给我们提供了实时的建议和解决方&#xff0c;无论是快速修复错误、提升代…

Opencv计算机视觉编程攻略-第九节 描述和匹配兴趣点

一般而言&#xff0c;如果一个物体在一幅图像中被检测到关键点&#xff0c;那么同一个物体在其他图像中也会检测到同一个关键点。图像匹配是关键点的常用功能之一&#xff0c;它的作用包括关联同一场景的两幅图像、检测图像中事物的发生地点等等。 1.局部模板匹配 凭单个像素就…

C++内存管理优化实战:提升应用性能与效率

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家、CSDN平台优质创作者&#xff0c;高级开发工程师&#xff0c;数学专业&#xff0c;拥有高级工程师证书&#xff1b;擅长C/C、C#等开发语言&#xff0c;熟悉Java常用开发技术&#xff0c;能熟练应用常用数据库SQL server,Oracle…

17-产品经理-创建发布

点击“发布”-“创建发布”。 填写发布名称&#xff0c;选择测试的版本。还可以设置此次发布是否为“里程碑”。 点击“保存”后&#xff0c;进入该发布详情页面。需要为此次发布关联需求、已解决BUG、以及遗留BUG。可以通过设置条件&#xff0c;进行“搜索”&#xff0c;然后批…

Axure RP9.0教程 | 内联框架 对应html 元素中的iframe标签 (打开内部页面和外部网址)

文章目录 引言I 打开内部页面II 打开外部网址操作效果引言 应用场景: 选择右侧不同栏目,左侧内容发生变化 I 打开内部页面 在公用元件库中找到内联框架图标,将其拖到画布中,设置其宽、高;在右侧添加三个按钮,分别用来跳转三个不同的页面;在内部框架中,添加三个子页面,…

在1panel中安装WebUI

如果需要建站&#xff0c;那得选安装Openresty。点击应用商店&#xff0c;安装 Openresty 接下来安装Ollama&#xff0c;可以部署本地模型提供给WebUi平台使用 最后是安装 WebUi&#xff0c;安装时需要填写Ollama的地址: 容器地址&#xff1a;30000 这些安装都很方便&#xf…

项目难点亮点

Vue项目 RBAC设计 用户权限设置 WebSocket 消息处理 BPMN扩展 跨语言模型的调用 大片文件(影像,模型等,数据-模型集成) 组件&指令封装 低代码表单构建、BPMN编辑器集成与实现 通用参考点 若依(RuoYi)是一个基于 Vue.js 和 Spring Boot 的前后端分离权限管理系…

JVM生产环境调优实战

案例三&#xff1a;JVM频繁Full GC优化 1. 项目背景&#xff08;Situation&#xff09; 在云中万维跨境支付的反洗钱系统中&#xff0c;我们负责对海量交易数据进行实时规则校验&#xff0c;以确保符合监管要求。系统日均处理交易量超过500万笔&#xff0c;峰值QPS达到3000&a…

ASP.NET Web 中进行 GET/POST 提交并接收返回数据的几种方案

在 ASP.NET Web 应用程序中进行 GET 请求并接收返回数据可以通过多种方式实现&#xff0c;以下是几种常见的方法&#xff1a; 1. 使用 WebClient 类&#xff08;简单方式&#xff09; using System.Net; using System.IO;public string GetDataFromUrl(string url) {using (W…

Springboot--Kafka客户端参数关键参数的调整方法

调整 Kafka 客户端参数需结合生产者、消费者和 Broker 的配置&#xff0c;以实现性能优化、可靠性保障或资源限制。以下是关键参数的调整方法和注意事项&#xff1a; 一、生产者参数调整 ‌max.request.size‌ ‌作用‌&#xff1a;限制单个请求的最大字节数&#xff08;包括消…

Android学习总结之service篇

引言 在 Android 开发里&#xff0c;Service 与 IntentService 是非常关键的组件&#xff0c;它们能够让应用在后台开展长时间运行的操作。不过&#xff0c;很多开发者仅仅停留在使用这两个组件的层面&#xff0c;对其内部的源码实现了解甚少。本文将深入剖析 Service 和 Inte…

ExternalProject_Add 使用手册与文档详解

一、基本概念与语法 ExternalProject_Add 是 CMake 的一个核心命令&#xff0c;用于在构建过程中集成和管理外部项目&#xff08;如第三方库&#xff09;。它支持完整的生命周期管理&#xff0c;包括下载、配置、构建、安装和测试。 语法&#xff1a; ExternalProject_Add(&l…

低延迟云网络的核心技术

低延迟云网络通过架构优化、协议创新、硬件加速等多维度技术手段,将数据传输延迟降低至毫秒级甚至微秒级。 1. 网络架构优化 1.1 扁平化网络Leaf-Spine 架构 减少网络层级,缩短数据转发路径(如数据中心内部一跳可达)。 扁平化网络Leaf-Spine(叶子-脊椎)架构是一种现代…

网络安全法规与入门指南

在当今数字化时代&#xff0c;网络安全已成为保障个人隐私、企业利益和国家安全的关键领域。随着网络攻击的日益复杂和频繁&#xff0c;了解和遵守网络安全法规变得尤为重要。本文将深入探讨网络安全相关法规&#xff0c;并为想要进入这一领域的读者提供实用的入门指南。 一、…

硬盘分区格式方案之 MBR(Master Boot Record)主引导记录的 主分区 和 扩展分区 笔记250407

硬盘分区格式方案之 MBR&#xff08;Master Boot Record&#xff09;主引导记录的 主分区 和 扩展分区 笔记250407 一、主分区&#xff08;Primary Partition&#xff09; 1. 定义与功能 直接引导操作系统&#xff1a;主分区是独立的存储单元&#xff0c;可直接安装操作系统并…

【Proteus仿真】【32单片机-A007】PT100热敏温度检测系统设计

目录 一、主要功能 二、使用步骤 三、硬件资源 四、软件设计 五、实验现象 联系作者 一、主要功能 1、LCD1602显示当前检测的温度值以及温度阈值 2、超过上限温度&#xff0c;降温模块启动​ 3、PT100热敏电阻测量-60C-135C 4、按键设置温度阈值 5、超过阈值&#xff0…

pyqt SQL Server 数据库查询-优化2

1、增加导出数据功能 2、增加删除表里数据功能 import sys import pyodbc from PyQt6.QtWidgets import QApplication, QWidget, QVBoxLayout, QHBoxLayout, QListWidget, QLineEdit, QPushButton, \QTableWidget, QTableWidgetItem, QLabel, QMessageBox from PyQt6.QtGui i…

Github 热点项目 ChartDB AI自动导表结构+迁移脚本,3分钟生成专业数据库关系图

ChartDB堪称数据库设计神器&#xff01;亮点①&#xff1a;动动手指输入SQL&#xff0c;秒出结构图&#xff0c;表关系一目了然&#xff0c;团队评审时再也不用画图两小时。亮点②&#xff1a;AI智能转换超贴心&#xff0c;MySQL转PostgreSQL只需点个按钮&#xff0c;跨平台迁移…