18 设计模式之迭代器模式(书籍遍历案例)
一、什么是迭代器模式
迭代器模式(Iterator Pattern)是一种行为型设计模式,允许客户端通过统一的接口顺序访问一个集合对象中的元素,而无需暴露集合对象的内部实现。这个模式主要用于访问聚合对象(如集合、数组等)中的元素,并且能够支持不同类型的聚合对象。
主要角色:
- Iterator(迭代器):提供遍历集合元素的接口,通常包括
hasNext()和next()方法。 - ConcreteIterator(具体迭代器):实现
Iterator接口,跟踪集合的当前状态,并实现集合的迭代。 - Aggregate(聚合接口):定义创建迭代器的方法。
- ConcreteAggregate(具体聚合):实现
Aggregate接口,返回对应的具体迭代器。
二、迭代器模式的应用场景
迭代器模式通常应用于以下场景:
- 当需要顺序访问集合中的元素时,不需要知道具体的存储方式(例如数组、链表等)。
- 想要提供一个统一的遍历接口,支持多种不同类型的聚合对象。
- 当要对集合元素进行多次遍历时,可以减少代码重复性。
三、迭代器模式的优缺点
1.优点:
- 封装性:客户端无需了解集合的内部结构,通过迭代器统一访问集合元素。
- 灵活性:可以通过不同的迭代器实现来支持对不同类型集合的访问。
- 解耦:集合和客户端解耦,客户端只关心元素的顺序,而不需要关心集合的具体实现方式。
2.缺点:
- 增加复杂性:引入了额外的迭代器类和接口,代码结构可能变得更复杂。
- 性能问题:如果集合中元素较多,迭代器可能会增加额外的时间复杂度。
四、迭代器模式的代码实现
1.定义迭代器接口
首先,我们定义一个通用的迭代器接口 Iterator,它需要包含两个方法:hasNext() 和 next()。
public interface Iterator {boolean hasNext();String next();
}
hasNext():判断集合是否还有元素。next():返回当前元素,并将迭代器指向下一个元素。
2. 创建具体迭代器类
然后,我们实现一个具体的迭代器类 BookIterator,来跟踪书籍集合的位置,并提供实际的遍历功能。
public class BookIterator implements Iterator {private BookCollection bookCollection;private int currentIndex = 0;public BookIterator(BookCollection bookCollection) {this.bookCollection = bookCollection;}@Overridepublic boolean hasNext() {return currentIndex < bookCollection.getBooks().size();}@Overridepublic String next() {if (hasNext()) {return bookCollection.getBooks().get(currentIndex++);}return null;}
}
在 BookIterator 类中,我们维护一个 currentIndex 变量,用来追踪当前指向的位置。通过实现 hasNext() 和 next() 方法,我们可以顺序访问集合中的元素。
3. 创建聚合类
接下来,我们创建一个聚合类 BookCollection,它是一个包含多个书籍名称的集合。BookCollection 类需要提供方法来添加书籍,并返回具体的迭代器。
import java.util.ArrayList;
import java.util.List;public class BookCollection {private List<String> books;public BookCollection() {books = new ArrayList<>();}public void addBook(String book) {books.add(book);}public List<String> getBooks() {return books;}public Iterator createIterator() {return new BookIterator(this);}
}
4. 测试迭代器模式
最后,我们在 TestIterator 类中,创建一个 BookCollection 对象,并通过迭代器遍历其中的书籍:
public class TestIterator {public static void main(String[] args) {// 创建书籍集合BookCollection bookCollection = new BookCollection();// 添加书籍bookCollection.addBook("Java设计模式");bookCollection.addBook("软件工程导论");bookCollection.addBook("JavaWeb");bookCollection.addBook("软件设计师");// 获取迭代器并遍历书籍Iterator iterator = bookCollection.createIterator();// 使用迭代器遍历书籍集合while (iterator.hasNext()) {String book = iterator.next();System.out.println(book);}}
}
5.输出
Java设计模式
软件工程导论
JavaWeb
软件设计师
五、代码解析
- Iterator 接口:定义了遍历集合的标准方法:
hasNext()和next()。 - ConcreteIterator(BookIterator):实现了
Iterator接口,具体负责遍历书籍集合,保持当前索引,并提供方法返回当前书籍。 - ConcreteAggregate(BookCollection):表示一个书籍集合,提供方法添加书籍和创建迭代器。
- TestIterator:测试类,用来展示如何创建
BookCollection对象并使用迭代器遍历书籍。
六、总结
迭代器模式通过提供一个统一的访问接口,使得客户端能够在不暴露集合内部结构的情况下,顺序访问集合中的元素。通过实现 Iterator 接口和具体的迭代器类,我们可以轻松地遍历各种集合对象。不过,它也增加了一定的复杂性,特别是在处理大型集合时,可能会影响性能。
相关文章:
18 设计模式之迭代器模式(书籍遍历案例)
一、什么是迭代器模式 迭代器模式(Iterator Pattern)是一种行为型设计模式,允许客户端通过统一的接口顺序访问一个集合对象中的元素,而无需暴露集合对象的内部实现。这个模式主要用于访问聚合对象(如集合、数组等&…...
超清4K视频素材哪里找?优质下载资源网站分享
我是你们的自媒体UP主小李。现在是高清、4K视频大行其道的时代,想要制作出吸引眼球的优质内容,超清4K视频素材必不可少。今天就为大家分享几个宝藏网站,让你的视频创作更轻松、更出彩! 蛙学网 首先推荐 蛙学网,这是国内…...
刷题日志【1】
目录 1.全排列【力扣】 代码1: 代码2: 2、子集【力扣】 3、全排列Ⅱ【力扣】 4、组合【力扣】 1.全排列【力扣】 代码1: class Solution {bool check[7];vector <int> path;vector<vector<int>> ret;public:vecto…...
【C++算法】32.前缀和_矩阵区域和
文章目录 题目链接:题目描述:解法C 算法代码: 题目链接: 1314. 矩阵区域和 题目描述: 解法 防止有人看不明白题目,先解释一下题目 二维前缀和思想: 使用前缀和矩阵 ret [x1,y1]~[x2,y2] D …...
使用堆栈(Stack)
集合类型(Collection)下篇_xml collection-CSDN博客 以上是堆栈的简单介绍,下方是堆栈的使用 题目:给定一个逆波兰表达式(后缀表达式)的字符串数组tokens,其中每个元素是一个操作数(数字&…...
雨晨 2610(2)0.2510 Windows 11 24H2 Iot 企业版 LTSC 2024 极简 2in1
文件: 雨晨 2610(2)0.2510 Windows 11 24H2 Iot 企业版 LTSC 2024 极简 2in1 install.esd 索引: 1 名称: Windows 11 IoT 企业版 LTSC 极简 26100.2510 描述: Windows 11 IoT 企业版 LTSC 极简 26100.2510 By YCDISM RTM 2025 24-12-07 大小: 8,176,452,990 个字节 索引: 2 …...
HDD 2025年技术趋势深度分析报告
随着数据量的指数级增长以及人工智能(AI)、物联网(IoT)、云计算和视频监控等领域的需求激增,硬盘驱动器(HDD)行业正面临着前所未有的挑战与机遇。本报告旨在深入剖析2025年HDD技术的发展方向&am…...
算法-字符串-22.括号生成
一、题目 二、思路解析 1.思路: 生成所有可能并且有效的括号组合——回溯方法 2.常用方法: a.数组,因为需要增删元素,所以选择LinkedList LinkedList<String> resnew LinkedList<>(); b.StringBuilder创建࿰…...
Free-RTOS实现LED闪烁
开发板:正点原子探索者 F407 LED定时定时闪烁 本次实验验证: 配置文件 1、打开CubeMX 2、选择芯片型号,然后点击开始项目 3、配置时钟 配置烧录引脚,与FreeRTOS系统时钟 选择FreeRTOS 这里已经默认有一个任务ÿ…...
NLP论文速读(斯坦福大学)|使用Tree将语法隐藏到Transformer语言模型中正则化
论文速读|Sneaking Syntax into Transformer Language Models with Tree Regularization 论文信息: 简介: 本文的背景是基于人类语言理解的组合性特征,即语言处理本质上是层次化的:语法规则将词级别的意义组合成更大的成分的意义&…...
再谈多重签名与 MPC
目录 什么是 MPC 钱包以及它们是如何出现的 多重签名和智能合约钱包已经成熟 超越 MPC 钱包 关于小队 多重签名已经成为加密货币领域的一部分,但近年来,随着 MPC(多方计算)钱包的出现,多重签名似乎被掩盖了。MPC 钱包之…...
CTF学习24.11.19[音频隐写]
MISC07[音频隐写] 隐写术 隐写术是一门关于信息隐藏的技巧与科学,所谓信息隐藏指的是不让除预期的接收者之外的任何人知晓信息的传递事件或者信息的内容。隐写术的英文叫做Steganography,来源于特里特米乌斯的一本讲述密码学与隐写术的著作Steganograp…...
vue的watch是否可以取消? 怎么取消?
发现宝藏 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【宝藏入口】。 Vue 可以通过 watch API 返回的一个 取消函数,可以在需要时取消该监听。 如何取消 watch? 当你使用 Vu…...
23、枚举
1、枚举 罗列一些标识符,当做整型数据使用。为了代码的易读性 1.1、枚举定义 enum 枚举名{大写标识符,大写标识符....}; 枚举类型名:enum 枚举名 枚举里面如果不给标识符赋值,默认从0开始,依次增1 如果里面的标识符有赋值…...
Java基本概念
Java特点 简单性。容易使用,比如没有C复杂的指针 面向对象。将对象属性剥离,当属性需要大量调用时节省代码,比如把大象装进冰箱,JAVA将大象分成跑、睡觉等不同功能,当需要就调用 分布式。 健壮性 安全性 体系结构…...
C++学习——如何析构派生类
C——继承关系中的虚函数 析构派生类纯虚构函数和抽象类 析构派生类 先看一段简单的代码: #include <iostream>using namespace std;class AA { public:AA() {cout << "调用了基类构造" << endl;}virtual void func() {cout <<…...
SpringCloud与Dubbo的区别
在构建分布式系统时,SpringCloud和Dubbo是两个常用的框架。虽然它们都能帮助开发者实现服务之间的通信和治理,但在设计理念、使用场景和技术实现上,两者存在明显的区别。本文将详细探讨SpringCloud与Dubbo的不同之处,以帮助开发者…...
C# 设计模式--建造者模式 (Builder Pattern)
定义 建造者模式是一种创建型设计模式,它允许你逐步构建复杂对象,而无需使用多个构造函数或重载。建造者模式将对象的构建过程与表示分离,使得相同的构建过程可以创建不同的表示。 正确写法 假设我们有一个复杂的 Car 对象,需要…...
leetcode 23. 合并 K 个升序链表
给你一个链表数组,每个链表都已经按升序排列。 输入:lists [[1,4,5],[1,3,4],[2,6]] 输出:[1,1,2,3,4,4,5,6] 解释:链表数组如下: [1->4->5,1->3->4,2->6 ] 将它们合并到一个有序链表中得到。 1->…...
【Redis】深入解析Redis缓存机制:全面掌握缓存更新、穿透、雪崩与击穿的终极指南
文章目录 一、Redis缓存机制概述1.1 Redis缓存的基本原理1.2 常见的Redis缓存应用场景 二、缓存更新机制2.1 缓存更新的策略2.2 示例代码:主动更新缓存 三、缓存穿透3.1 缓存穿透的原因3.2 缓解缓存穿透的方法3.3 示例代码:使用布隆过滤器 四、缓存雪崩4…...
独立开发者如何利用 Taotoken 统一管理多个 AI 项目支出
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 独立开发者如何利用 Taotoken 统一管理多个 AI 项目支出 对于同时维护多个小型 AI 应用或实验项目的独立开发者而言,成…...
Habitat-Lab:Meta开源具身AI仿真平台,从零搭建智能体训练场
1. 项目概述:从虚拟到现实的智能体训练场如果你对机器人、具身智能或者强化学习感兴趣,那么“Habitat-Lab”这个名字你大概率不会陌生。简单来说,Habitat-Lab是一个由Meta AI(前Facebook AI Research)开源的、用于具身…...
RK3588开发板Debian系统从零配置到实战:安全加固、Docker部署与性能调优
1. 项目概述:从零上手TL3588的Debian系统最近在折腾一块基于瑞芯微RK3588芯片的开发板,型号是TL3588。这板子性能是真不错,八核CPU加上强大的NPU,拿来做边缘计算、多媒体网关或者轻量级服务器都挺合适。但刚拿到手,面对…...
ElevenLabs动画配音语音项目踩坑实录,深度复盘4类合规风险与3种本地化绕过方案
更多请点击: https://intelliparadigm.com 第一章:ElevenLabs动画配音语音项目踩坑实录,深度复盘4类合规风险与3种本地化绕过方案 在为国产原创2D动画《星尘回廊》接入ElevenLabs API实现多语种AI配音时,团队遭遇了超出预期的合规…...
BOX工控机在无人机机载系统中有什么优势?这 3 点是普通工控机比不了的
现在的无人机机载系统,越来越多的人选择用 BOX工控机。很多人问我,BOX工控机到底是什么?它和普通的工控机有什么区别?为什么大家都在用它?今天我就跟大家好好聊聊这个话题。我会从一个 17 年工控人的角度,给大家讲透 BOX工控机在无人机机载…...
团队协作福音:如何用EasyYapi插件统一SpringBoot项目的接口文档风格?
团队协作福音:如何用EasyYapi插件统一SpringBoot项目的接口文档风格? 在微服务架构盛行的今天,一个SpringBoot项目往往由多个团队协作开发。当接口数量突破三位数时,文档风格不统一、字段说明缺失等问题会让协作效率直线下降。上周…...
3大突破性功能:如何用QtScrcpy彻底改变你的Android投屏体验
3大突破性功能:如何用QtScrcpy彻底改变你的Android投屏体验 【免费下载链接】QtScrcpy Android real-time display control software 项目地址: https://gitcode.com/GitHub_Trending/qt/QtScrcpy 你是否曾经为了在电脑上操作手机而烦恼?无论是游…...
Arm Cortex-X2/X3架构解析与性能优化实践
1. Arm Cortex-X2/X3集群架构概述在Armv9架构的高性能计算领域,Cortex-X2和X3代表了当前最先进的CPU设计理念。作为DynamIQ共享单元(DSU)的核心组件,它们通过可配置的缓存层次结构和智能一致性协议,为现代异构计算提供了灵活的解决方案。1.1 …...
量化交易强化学习环境TradingGym:从Gym接口到实战策略训练
1. 项目概述:一个为量化交易策略量身定制的强化学习训练场如果你正在尝试将强化学习(Reinforcement Learning, RL)应用到股票、期货或加密货币的量化交易中,大概率会遇到一个共同的困境:环境太难搭了。市面上的回测框架…...
终极免费换肤方案:R3nzSkin国服版完整使用教程
终极免费换肤方案:R3nzSkin国服版完整使用教程 【免费下载链接】R3nzSkin-For-China-Server Skin changer for League of Legends (LOL) 项目地址: https://gitcode.com/gh_mirrors/r3/R3nzSkin-For-China-Server 想要在英雄联盟国服免费体验所有皮肤&#x…...
