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

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
软件设计师


五、代码解析

  1. Iterator 接口:定义了遍历集合的标准方法:hasNext()next()
  2. ConcreteIterator(BookIterator):实现了 Iterator 接口,具体负责遍历书籍集合,保持当前索引,并提供方法返回当前书籍。
  3. ConcreteAggregate(BookCollection):表示一个书籍集合,提供方法添加书籍和创建迭代器。
  4. TestIterator:测试类,用来展示如何创建 BookCollection 对象并使用迭代器遍历书籍。

六、总结

        迭代器模式通过提供一个统一的访问接口,使得客户端能够在不暴露集合内部结构的情况下,顺序访问集合中的元素。通过实现 Iterator 接口和具体的迭代器类,我们可以轻松地遍历各种集合对象。不过,它也增加了一定的复杂性,特别是在处理大型集合时,可能会影响性能。

相关文章:

18 设计模式之迭代器模式(书籍遍历案例)

一、什么是迭代器模式 迭代器模式&#xff08;Iterator Pattern&#xff09;是一种行为型设计模式&#xff0c;允许客户端通过统一的接口顺序访问一个集合对象中的元素&#xff0c;而无需暴露集合对象的内部实现。这个模式主要用于访问聚合对象&#xff08;如集合、数组等&…...

超清4K视频素材哪里找?优质下载资源网站分享

我是你们的自媒体UP主小李。现在是高清、4K视频大行其道的时代&#xff0c;想要制作出吸引眼球的优质内容&#xff0c;超清4K视频素材必不可少。今天就为大家分享几个宝藏网站&#xff0c;让你的视频创作更轻松、更出彩&#xff01; 蛙学网 首先推荐 蛙学网&#xff0c;这是国内…...

刷题日志【1】

目录 1.全排列【力扣】 代码1&#xff1a; 代码2&#xff1a; 2、子集【力扣】 3、全排列Ⅱ【力扣】 4、组合【力扣】 1.全排列【力扣】 代码1&#xff1a; class Solution {bool check[7];vector <int> path;vector<vector<int>> ret;public:vecto…...

【C++算法】32.前缀和_矩阵区域和

文章目录 题目链接&#xff1a;题目描述&#xff1a;解法C 算法代码&#xff1a; 题目链接&#xff1a; 1314. 矩阵区域和 题目描述&#xff1a; 解法 防止有人看不明白题目&#xff0c;先解释一下题目 二维前缀和思想&#xff1a; 使用前缀和矩阵 ret [x1,y1]~[x2,y2] D …...

使用堆栈(Stack)

集合类型&#xff08;Collection)下篇_xml collection-CSDN博客 以上是堆栈的简单介绍&#xff0c;下方是堆栈的使用 题目&#xff1a;给定一个逆波兰表达式&#xff08;后缀表达式&#xff09;的字符串数组tokens&#xff0c;其中每个元素是一个操作数&#xff08;数字&…...

雨晨 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年技术趋势深度分析报告

随着数据量的指数级增长以及人工智能&#xff08;AI&#xff09;、物联网&#xff08;IoT&#xff09;、云计算和视频监控等领域的需求激增&#xff0c;硬盘驱动器&#xff08;HDD&#xff09;行业正面临着前所未有的挑战与机遇。本报告旨在深入剖析2025年HDD技术的发展方向&am…...

算法-字符串-22.括号生成

一、题目 二、思路解析 1.思路&#xff1a; 生成所有可能并且有效的括号组合——回溯方法 2.常用方法&#xff1a; a.数组&#xff0c;因为需要增删元素&#xff0c;所以选择LinkedList LinkedList<String> resnew LinkedList<>(); b.StringBuilder创建&#xff0…...

Free-RTOS实现LED闪烁

开发板&#xff1a;正点原子探索者 F407 LED定时定时闪烁 本次实验验证&#xff1a; 配置文件 1、打开CubeMX 2、选择芯片型号&#xff0c;然后点击开始项目 3、配置时钟 配置烧录引脚&#xff0c;与FreeRTOS系统时钟 选择FreeRTOS 这里已经默认有一个任务&#xff…...

NLP论文速读(斯坦福大学)|使用Tree将语法隐藏到Transformer语言模型中正则化

论文速读|Sneaking Syntax into Transformer Language Models with Tree Regularization 论文信息&#xff1a; 简介&#xff1a; 本文的背景是基于人类语言理解的组合性特征&#xff0c;即语言处理本质上是层次化的&#xff1a;语法规则将词级别的意义组合成更大的成分的意义&…...

再谈多重签名与 MPC

目录 什么是 MPC 钱包以及它们是如何出现的 多重签名和智能合约钱包已经成熟 超越 MPC 钱包 关于小队 多重签名已经成为加密货币领域的一部分&#xff0c;但近年来&#xff0c;随着 MPC&#xff08;多方计算&#xff09;钱包的出现&#xff0c;多重签名似乎被掩盖了。MPC 钱包之…...

CTF学习24.11.19[音频隐写]

MISC07[音频隐写] 隐写术 隐写术是一门关于信息隐藏的技巧与科学&#xff0c;所谓信息隐藏指的是不让除预期的接收者之外的任何人知晓信息的传递事件或者信息的内容。隐写术的英文叫做Steganography&#xff0c;来源于特里特米乌斯的一本讲述密码学与隐写术的著作Steganograp…...

vue的watch是否可以取消? 怎么取消?

发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【宝藏入口】。 Vue 可以通过 watch API 返回的一个 取消函数&#xff0c;可以在需要时取消该监听。 如何取消 watch&#xff1f; 当你使用 Vu…...

23、枚举

1、枚举 罗列一些标识符&#xff0c;当做整型数据使用。为了代码的易读性 1.1、枚举定义 enum 枚举名{大写标识符,大写标识符....}; 枚举类型名&#xff1a;enum 枚举名 枚举里面如果不给标识符赋值&#xff0c;默认从0开始&#xff0c;依次增1 如果里面的标识符有赋值…...

Java基本概念

Java特点 简单性。容易使用&#xff0c;比如没有C复杂的指针 面向对象。将对象属性剥离&#xff0c;当属性需要大量调用时节省代码&#xff0c;比如把大象装进冰箱&#xff0c;JAVA将大象分成跑、睡觉等不同功能&#xff0c;当需要就调用 分布式。 健壮性 安全性 体系结构…...

C++学习——如何析构派生类

C——继承关系中的虚函数 析构派生类纯虚构函数和抽象类 析构派生类 先看一段简单的代码&#xff1a; #include <iostream>using namespace std;class AA { public:AA() {cout << "调用了基类构造" << endl;}virtual void func() {cout <<…...

SpringCloud与Dubbo的区别

在构建分布式系统时&#xff0c;SpringCloud和Dubbo是两个常用的框架。虽然它们都能帮助开发者实现服务之间的通信和治理&#xff0c;但在设计理念、使用场景和技术实现上&#xff0c;两者存在明显的区别。本文将详细探讨SpringCloud与Dubbo的不同之处&#xff0c;以帮助开发者…...

C# 设计模式--建造者模式 (Builder Pattern)

定义 建造者模式是一种创建型设计模式&#xff0c;它允许你逐步构建复杂对象&#xff0c;而无需使用多个构造函数或重载。建造者模式将对象的构建过程与表示分离&#xff0c;使得相同的构建过程可以创建不同的表示。 正确写法 假设我们有一个复杂的 Car 对象&#xff0c;需要…...

leetcode 23. 合并 K 个升序链表

给你一个链表数组&#xff0c;每个链表都已经按升序排列。 输入&#xff1a;lists [[1,4,5],[1,3,4],[2,6]] 输出&#xff1a;[1,1,2,3,4,4,5,6] 解释&#xff1a;链表数组如下&#xff1a; [1->4->5,1->3->4,2->6 ] 将它们合并到一个有序链表中得到。 1->…...

【Redis】深入解析Redis缓存机制:全面掌握缓存更新、穿透、雪崩与击穿的终极指南

文章目录 一、Redis缓存机制概述1.1 Redis缓存的基本原理1.2 常见的Redis缓存应用场景 二、缓存更新机制2.1 缓存更新的策略2.2 示例代码&#xff1a;主动更新缓存 三、缓存穿透3.1 缓存穿透的原因3.2 缓解缓存穿透的方法3.3 示例代码&#xff1a;使用布隆过滤器 四、缓存雪崩4…...

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

JDK 17 新特性

#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持&#xff0c;不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的&#xff…...

Java面试专项一-准备篇

一、企业简历筛选规则 一般企业的简历筛选流程&#xff1a;首先由HR先筛选一部分简历后&#xff0c;在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如&#xff1a;Boss直聘&#xff08;招聘方平台&#xff09; 直接按照条件进行筛选 例如&#xff1a…...

现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?

现有的 Redis 分布式锁库&#xff08;如 Redisson&#xff09;相比于开发者自己基于 Redis 命令&#xff08;如 SETNX, EXPIRE, DEL&#xff09;手动实现分布式锁&#xff0c;提供了巨大的便利性和健壮性。主要体现在以下几个方面&#xff1a; 原子性保证 (Atomicity)&#xff…...

c++第七天 继承与派生2

这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分&#xff1a;派生类构造函数与析构函数 当创建一个派生类对象时&#xff0c;基类成员是如何初始化的&#xff1f; 1.当派生类对象创建的时候&#xff0c;基类成员的初始化顺序 …...

日常一水C

多态 言简意赅&#xff1a;就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过&#xff0c;当子类和父类的函数名相同时&#xff0c;会隐藏父类的同名函数转而调用子类的同名函数&#xff0c;如果要调用父类的同名函数&#xff0c;那么就需要对父类进行引用&#…...

macOS 终端智能代理检测

&#x1f9e0; 终端智能代理检测&#xff1a;自动判断是否需要设置代理访问 GitHub 在开发中&#xff0c;使用 GitHub 是非常常见的需求。但有时候我们会发现某些命令失败、插件无法更新&#xff0c;例如&#xff1a; fatal: unable to access https://github.com/ohmyzsh/oh…...

Vue3中的computer和watch

computed的写法 在页面中 <div>{{ calcNumber }}</div>script中 写法1 常用 import { computed, ref } from vue; let price ref(100);const priceAdd () > { //函数方法 price 1price.value ; }//计算属性 let calcNumber computed(() > {return ${p…...

深度解析:etcd 在 Milvus 向量数据库中的关键作用

目录 &#x1f680; 深度解析&#xff1a;etcd 在 Milvus 向量数据库中的关键作用 &#x1f4a1; 什么是 etcd&#xff1f; &#x1f9e0; Milvus 架构简介 &#x1f4e6; etcd 在 Milvus 中的核心作用 &#x1f527; 实际工作流程示意 ⚠️ 如果 etcd 出现问题会怎样&am…...