重学设计模式-Iterator(迭代器模式)

Iterator迭代器模式

介绍:

迭代器模式是一种行为型设计模式,它允许你在不暴露集合底层表示(并不知道集合底层使用何种方式对数据尽心存储)的情况下遍历集合中的元素。

  • 这种模式提供了一种方法,可以顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。
  • 迭代器模式通常包括两个角色:迭代器和聚合对象。
    • 迭代器(Iterator,读取元素
      • 负责定义访问和遍历元素的接口
      • 实现了该接口的类,拥有访问聚合对象中元素的能力
    • 聚合对象(Aggregate,存储元素
      • 负责定义创建相应迭代器对象的接口,该接口返回一个适当的迭代器实例
      • 实现了该接口的类将成为一个可以保存多个元素的集合,就像数组一样

以下是一个简单的迭代器实例,演示了如何使用迭代器模式遍历一个集合:

1、抽象实例

创建迭代器接口:

/*** 迭代器接口** @author supanpan* @date 2023/12/21*/
public interface Iterator<T>{/*** 判断是否存在下一个元素* @return: 循环终止条件*  true:集合中存在下一个元素*  false:集合中不存在下一个元素*/boolean hasNext();/*** 获取下一个元素,并且将迭代器指针位置移动到下一个元素*/T next();
}

实现迭代器接口,具体迭代器实现:

/*** 具体迭代器实现** @author supanpan* @date 2023/12/21*/
public class ConcreteIterator<T> implements Iterator<T> {private List<T> list;// 存放元素的列表private int position;// 遍历元素的下标/*** 初始化迭代器**/public ConcreteIterator(List<T> list) {this.list = list;this.position = 0;}/*** 判断是否到集合的末尾**/@Overridepublic boolean hasNext() {return position < list.size();}/*** 遍历(迭代)集合取出相应元素**/@Overridepublic T next() {if (!hasNext()){throw new NoSuchElementException("没有元素了......");}T item = list.get(position);position++;return item;}
}

创建聚合对象:

/*** 聚合对象** @author supanpan* @date 2023/12/21*/
public interface Aggregate<T> {/*** 生成一个用于遍历集合的迭代器**/Iterator<T> createIterator();
}

实现聚合对象接口,创建具体聚合对象:

/*** 具体聚合对象** @author supanpan* @date 2023/12/21*/
public class ConcreteAggregate<T> implements Aggregate<T>{private List<T> items;public ConcreteAggregate() {this.items = new ArrayList<>();}/*** 向集合中添加元素* @param item 待添加元素*/public void addItem(T item){items.add(item);}/*** 创建迭代器对象** @return 具体的迭代器*/@Overridepublic Iterator<T> createIterator() {
//         items.sort(null);// 在创建迭代器之前对集合中的元素进行排序操作return new ConcreteIterator<>(items);// 将聚合对象中的集合传递给具体迭代器对象,以供访问}
}

测试Main:

public class Main {public static void main(String[] args) {// 创建聚合对象ConcreteAggregate<String> aggregate = new ConcreteAggregate<>();// 向聚合对象中添加元素aggregate.addItem("Item 1");aggregate.addItem("Item 3");aggregate.addItem("Item 2");aggregate.addItem("Item 4");// 获取迭代器对象Iterator<String> iterator = aggregate.createIterator();// 使用迭代器模式进行遍历while (iterator.hasNext()){// 获取迭代器中的元素String item = iterator.next();System.out.println(item);}}
}

2、书架实例

创建聚合对象,用于将具体实现类中的集合通过迭代器进行返回

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

创建迭代器对象,用于访问聚合对象中的数组数据

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

创建Book对象,Book对象用于获取书籍的名称

public class Book {private String name;// 书籍名称public Book(String name) {this.name = name;}public String getName() {return name;}
}

创建BookShelf对象,这个对象实现了Aggregate接口,拥有聚合元素的能力

public class BookShelf implements Aggregate{private ArrayList<Book> books;// 对比抽象实例中的数组,这里改成了存放书籍的列表/*** 初始化集合对象** @param initialSize 集合大小*/public BookShelf(int initialSize){this.books = new ArrayList<>(initialSize);}public Book getBookAt(int index) {return (Book) books.get(index);}public void appendBook(Book book) {books.add(book);}public int getLength() {return books.size();}/*** 将书籍数组返回给具体迭代器实现类,提供访问书籍数组的能力* */public Iterator iterator() {return new BookShelfIterator(this);}
}

创建BookShelfIterator对象,这个对象实现了Iterator接口,拥有访问聚合对象中的数据能力

public class BookShelfIterator implements Iterator{private BookShelf bookShelf;private int index;/*** 初始化迭代器* @param bookShelf 聚合对象集合数据*/public BookShelfIterator(BookShelf bookShelf) {this.bookShelf = bookShelf;this.index = 0;}@Overridepublic boolean hasNext() {return index < bookShelf.getLength();}@Overridepublic Object next() {Book item = bookShelf.getBookAt(index);index++;return item;}
}

测试类:

public class Main {public static void main(String[] args) {BookShelf bookShelf = new BookShelf(4);bookShelf.appendBook(new Book("时间简史"));bookShelf.appendBook(new Book("活着"));bookShelf.appendBook(new Book("百年孤独"));bookShelf.appendBook(new Book("1984"));bookShelf.appendBook(new Book("三体"));bookShelf.appendBook(new Book("围城"));bookShelf.appendBook(new Book("小王子"));bookShelf.appendBook(new Book("云边的小卖部"));Iterator it = bookShelf.iterator();while (it.hasNext()) {Book book = (Book)it.next();System.out.println(book.getName());}}
}

3、Iterator总结

通过以上两个实例,在每个实例中,都出现了相对重要的接口和实现类,这四个关键角色,分别是Iterator(迭代器)、ConcreteIterator(具体的迭代器)、Aggregate(聚合对象)和ConcreteAggregate(具体的聚合对象)。

  1. Iterator(迭代器)
  • Iterator是一个接口,它定义了在集合对象上进行迭代的方法
    • hasNext()用于检查是否还有下一个元素
    • next()用于获取下一个元素。
  1. ConcreteIterator(具体的迭代器)
  • ConcreteIterator是Iterator接口的具体实现,它持有对应的集合对象,并且在内部实现了迭代逻辑。
  • 具体的迭代器类通常会包含一个指向当前元素的游标,并且实现了Iterator接口中定义的方法。
  1. Aggregate(聚合对象)
  • Aggregate是一个接口,它定义了创建迭代器对象的方法,例如createIterator()
  • 聚合对象是包含一组元素的对象,它通常会提供一种方式来获取迭代器对象,使得外部客户端可以通过迭代器遍历聚合对象中的元素。
  1. ConcreteAggregate(具体的聚合对象)
  • ConcreteAggregate是Aggregate接口的具体实现,它实现了创建迭代器对象的方法,并且通常会包含一个内部集合来存储元素。
  • 具体的聚合对象类会将迭代器对象的创建委托给具体的迭代器类。

下面是Iterator实现的类图:

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

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

相关文章

Moonbeam生态项目分析 — — 游戏项目The Great Escape

概览 The Great Escape是一款2D的Play and Earn平台游戏&#xff0c;曾入选MoonbeamMoonbeam Accelerator&#xff0c;并经此培训孵化后于2023年7月正式发表。 玩家必须在给定时间内在充满敌人和陷阱的关卡中收集尽可能多的水果。游戏结束后&#xff0c;游戏主要根据收集的水…

Pytorch-RealSR超分模型

1.前言 RealSR 是一种基于学习的单图像超分辨率&#xff08;SISR&#xff09;模型&#xff0c;专门针对真实世界的图像。它由腾讯 AI 实验室于 2020 年提出。 RealSR 的核心创新是提出了一种新的退化模型&#xff0c;该模型能够更好地模拟真实世界的退化过程。该模型考虑了真实…

【已解决】修改了网站的class样式name值,会影响SEO,搜索引擎抓取网站及排名吗?

问题&#xff1a; 修改了网站的class样式name值&#xff0c;会影响搜索引擎抓取网站及排名吗&#xff1f; 解答&#xff1a; 如果你仅仅修改了网站class样式的名称&#xff0c;而没有改变网站的结构和内容&#xff0c;那么搜索引擎通常不会因此而影响它对网站的抓取和排名。但…

中国自动驾驶行业:迈向无限可能

中国自动驾驶行业正在经历蓬勃发展&#xff0c;取得了令人瞩目的成果。这一行业在技术创新、政策支持和市场需求等方面展现出巨大潜力。本文将从技术创新、产业生态和前景发展等角度&#xff0c;探讨中国自动驾驶行业的现状和未来前景。 中国自动驾驶行业正处于一个令人瞩目的快…

C++基础语法总结

C使用 C的源文件扩展名是&#xff1a;cppC程序的入口是main函数C完全兼容c语言的语法 1、cin、cout C中常使用cin、cout进行控制台的输入和输出 #include <iostream> using namespace std;int main() {cout << "hello world !!!" << endl;retu…

德人合科技 | 设计公司文件加密系统——天锐绿盾自动智能透明加密防泄密系统

设计公司文件加密系统——天锐绿盾自动智能透明加密防泄密系统 PC端访问地址&#xff1a; www.drhchina.com 一、背景介绍 设计公司通常涉及到大量的创意作品、设计方案、客户资料等重要文件&#xff0c;这些文件往往包含公司的核心价值和商业机密。因此&#xff0c;如何确保…

Linux磁盘空间不足扩展

先在虚拟机Vmware上扩展磁盘空间 后将fdisk 进行分区之后&#xff0c;在/dev/中找不到新分区文件 3.创建物理卷pv时发现找不到/dev/sda3分区&#xff0c;通过ls查看确认在/dev/中没有找到新分区文件 4.解决方法 执行&#xff1a;partprobe 再查看/dev中是否可以看到新分区文件…

云轴科技ZStack 英特尔联合成立云系统解决方案创新中心

近日&#xff0c;云轴科技ZStack 与英特尔联合成立云系统解决方案创新中心&#xff0c;并完成揭牌仪式。双方将基于多年合作基础进一步加快研发下一代创新技术和解决方案&#xff0c;为客户和合作伙伴提供更高效、安全的云基础设施解决方案。 左三:云轴科技ZStack 联合创始人兼…

量化交易学习笔记:XGBoost 在量化选股中的应用

一、引言 本篇文章通过借鉴传统机器学习算法——XGBoost——对相同的量价因子进行实验&#xff0c;方便与深度学习模型进行对比实践。 二、算法介绍 XGBoost 是在 Gradient Boosting&#xff08;梯度提升&#xff09;框架下实现的机器学习算法&#xff0c;全称为“极限梯度提…

FPGA模块——以太网(1)MDIO读写

FPGA模块——以太网MDIO读写 MDIO接口介绍MDIO接口代码&#xff08;1&#xff09;MDIO接口驱动代码&#xff08;2&#xff09;使用MDIO驱动的代码 MDIO接口介绍 MDIO是串行管理接口。MAC 和 PHY 芯片有一个配置接口&#xff0c;即 MDIO 接口&#xff0c;可以配置 PHY 芯片的工…

理解AI思维链:AI领域的核心概念及其意义

理解AI思维链&#xff1a;AI领域的核心概念及其意义 引言AI思维链的定义AI思维链的重要性实际应用案例分析面临的挑战与未来展望结语 引言 在这个日益由数据驱动的时代&#xff0c;人工智能&#xff08;AI&#xff09;已经成为科技领域的一颗耀眼的明星&#xff0c;其影响力遍…

(八)STM32 USART —— 串口通讯

目录 1. 串口通讯协议简介 1.1 物理层 1.1.1 电平标准 1&#xff09;TTL 电平 2&#xff09;RS-232 电平 3&#xff09;RS-485 电平 4&#xff09;CAN 总线电平 1.1.2 USB 和 串口 的区分 1.1.3 RS-232 信号线 1.2 协议层 1&#xff09;波特率 2&#xff09;通讯…

阿里云赵大川:弹性计算推理解决方案拯救 AIGC 算力危机

云布道师 本篇文章围绕弹性计算推理解决方案 DeepGPU 实例如何支持 Stable Diffusion 文生图推理、Stable Diffusion 推理演示示例等相关话题展开。 赵大川 阿里云弹性计算高级技术专家 GPU 云服务器推理解决方案的提出背景 随着 AIGC 时代的到来&#xff0c;两个重要应用应…

【pentaho】kettle读取Hive表不支持bigint和timstamp类型解决。

一、bigint类型 报错: Unable to get value BigNumber(16) from database resultset显示kettle认为此应该是decimal类型(kettle中是TYPE_BIGNUMBER或称BigNumber)&#xff0c;但实际hive数据库中是big类型。 修改kettle源码解决&#xff1a; kettle中java.sql.Types到kettle…

MFC使用高速绘图控件high-speed Charting Control绘制柱形图

1. 创建MFC单文档工程BarChartDemo。 2. 在工程文件夹下新建文件夹ChartCtrl,将ChartCtrl源码放入,如下图所示。在工程中添加这些项,项目——添加——现有项,全部添加。 3. 添加一个对话框,ID为IDD_DLG_BAR,类名为CBarDlg。 4. 在对话框中添加Custom Control控件,将控…

OSPF面试总结

OSPF 基本特点 属于IGP、LS支持无类域间路由没有环路&#xff08;区域内运行LS、区域间是DV,所以所有的区域要和区域0相连&#xff09;收敛速度快使用组播发送数据 224.0.0.5、224.0.0.6 什么时候用224.0.0.5&#xff1f;支持多条等价路由支持协议报文认证 OSPF路由的计算过程…

Python 爬虫之下载视频(二)

爬取某Y的视频链接和标题 文章目录 爬取某Y的视频链接和标题前言一、基本思路二、程序解析阶段三、程序处理阶段总结 前言 这篇内容就简单给大家写个如何从网页上爬取某B主 主页 页面上所有的视频链接和视频标题。 这篇是基础好好看&#xff0c;下篇会根据这篇的结果做一个批…

如何开发专属花店展示平台小程序?

如今&#xff0c;微信小程序已经成为了花店行业拓展客户资源的重要工具。通过开发一个专属花店小程序&#xff0c;你可以为自己的花店带来更多的曝光和客户资源。那么&#xff0c;如何开发一个专属花店小程序呢&#xff1f;接下来&#xff0c;我们将一步步为你详细讲解。 首先&…

产能过剩的今天,企业的方向在哪里?

随着经济的发展和技术的进步&#xff0c;许多行业都面临着产能过剩的问题。在产能过剩的背景下&#xff0c;企业如何找到新的发展方向&#xff0c;成为了一个亟待解决的问题。本文将探讨产能过剩时代下&#xff0c;企业应该如何寻找新的发展之路。 接下来我们就来看看当今的产…

共建还是对抗?BTC 铭文风波中开发者、矿工与社区的平衡艺术

近期&#xff0c;比特币铭文正加速进入一场争议与危机的漩涡。12 月 6 日&#xff0c;比特币核心开发人员 Luke Dashjr 在 X 表示&#xff0c;铭文&#xff08;Inscriptions&#xff09;正在利用比特币核心客户端 Bitcoin Core 的一个漏洞向区块链发送垃圾信息&#xff0c;Bitc…