重学设计模式-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.rhkb.cn/news/222668.html

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

相关文章

Tomcat转SpringBoot、tomcat升级到springboot、springmvc改造springboot

Tomcat转SpringBoot、tomcat升级到springboot、springmvc改造springboot 起因&#xff1a;我接手tomcat-springmvc-hibernate项目&#xff0c;使用tomcat时问题不大。自从信创开始&#xff0c;部分市场使用国产中间件&#xff0c;例如第一次听说的宝兰德、东方通&#xff0c;还…

让AIGC成为你的智能外脑,助力你的工作和生活

人工智能成为智能外脑 在当前的科技浪潮中&#xff0c;人工智能技术正在以前所未有的速度改变着我们的生活和工作方式。其中&#xff0c;AIGC技术以其强大的潜力和广泛的应用前景&#xff0c;正在引领着这场革命。 AIGC技术是一种基于人工智能的生成式技术&#xff0c;它可以通…

光模块市场分析与发展趋势预测

光模块是光通信领域的重要组成部分&#xff0c;随着数字经济&#xff0c;大数据&#xff0c;云计算&#xff0c;人工智能等行业的兴起&#xff0c;光模块市场经历了快速发展&#xff0c;逐渐在数据中心、无线回传、电信传输等应用场景中得到广泛应用。本文将基于当前光模块全球…

[JS设计模式]Flyweight Pattern

Flyweight pattern 享元模式是一种结构化的设计模式&#xff0c;主要用于产生大量类似对象而内存又有限的场景。享元模式能节省内存。 假设一个国际化特大城市SZ&#xff1b;它有5个区&#xff0c;分别为nanshan、futian、luohu、baoan、longgang&#xff1b;每个区都有多个图…

STM32F4的DHT11初始化与实例分析

STM32—— DHT11 本文主要涉及STM32F4 的DHT11的使用以及相关时序的介绍&#xff0c;最后有工程下载地址。 文章目录 STM32—— DHT11一、 DHT11的介绍1.1 DHT11的经典电路 二、DHT11的通信2.1 DHT11的传输数据格式2.2 DHT11 通信分步解析 三、 DHT11 代码3.1 引脚图3.2 电路图…

设计师都在用的5个设计灵感网站,赶紧收藏~

设计没灵感&#xff0c;就上这5个网站&#xff0c;绝对能打开新世界大门&#xff0c;全世界设计师的分享、互交站&#xff0c;最优秀的设计作品都在这&#xff0c;赶紧收藏好了~ pinterest​&#xff08;梯子&#xff09; https://www.pinterest.es/ Pinterest是以瀑布流的方式…

基于Java+SpringBoot+Mybaties-plus+Vue+ElementUI+Vant 电影院订票管理系统 的设计与实现

一.项目介绍 基于SpringBootVue 电影院订票管理系统 分为前端和后端。 前端&#xff08;用户&#xff09;&#xff1a; 登录后支持查看首页、电影、影院和我的信息 支持查看正在热映和即将上映的电影信息 支持购票&#xff08;需选择影院座位&#xff09;、看过&#xff08;评论…

千帆 AppBuilder 初体验,不仅解决解决了我筛选简历的痛苦,更是让提效10倍!

文章目录 &#x1f31f; 前言&#x1f31f; 什么是百度智能云千帆 AppBuilder&#x1f31f; 百度智能云千帆 AppBuilder 初体验&#x1f31f; 利用千帆AppBuilder搭建简历小助手&#x1f31f; 让人眼前一亮的神兵利器 - 超级助理 &#x1f31f; 前言 前两天朋友 三掌柜 去北京…

3. BlazorSignalRApp 结合使用 ASP.NET Core SignalR 和 Blazor

参考&#xff1a;https://learn.microsoft.com/zh-cn/aspnet/core/blazor/tutorials/signalr-blazor?viewaspnetcore-8.0&tabsvisual-studio 1.创建新项目 BlazorSignalRApp 2.添加项目依赖项 依赖项&#xff1a;Microsoft.AspNetCore.SignalR.Client 方式1 管理解决方案…

[笔记]ByteBuffer垃圾回收

参考&#xff1a;https://blog.csdn.net/lom9357bye/article/details/133702169 public static void main(String[] args) throws Throwable {List<Object> list new ArrayList<>();Thread thread new Thread(() -> {ByteBuffer byteBuffer ByteBuffer.alloc…

『 C++ 』二叉树进阶OJ题

文章目录 根据二叉树创建字符串 &#x1f996;&#x1f969; 题目描述&#x1f969; 解题思路&#x1f969; 代码 二叉树的层序遍历(分层遍历) &#x1f996;&#x1f969; 题目描述&#x1f969; 解题思路&#x1f969; 代码 二叉树的层序遍历(分层遍历)Ⅱ &#x1f996;&…

llvm后端之DAG设计

llvm后端之DAG设计 引言1 核心类设计2 类型系统2.1 MVT::SimpleValueType2.2 MVT2.3 EVT 3 节点类型 引言 llvm后端将中端的IR转为有向无环图&#xff0c;即DAG。如下图&#xff1a; 图中黑色箭头为数据依赖&#xff1b;蓝色线和红色线为控制依赖。蓝色表示指令序列化时两个节…

【Unity URP渲染管线下GUI圆形扇形_多功能线框Shader_案例分享】

【Unity URP渲染管线下GUI圆形&扇形_多功能线框Shader_案例分享】 上图看效果

搭建Eureka服务

搭建Eureka服务 文章目录 搭建Eureka服务搭建EurekaServer注册user-service注册多个实例 在order-service中完成服务拉取和负载均衡 搭建EurekaServer <dependency><!--eureka服务器--><groupId>org.springframework.cloud</groupId><artifactId>…

自我学习--关于如何设计光耦电路

本人在项目中多次设计光耦电路&#xff0c;目前电路在项目中运行比较平稳&#xff0c;所以总结一下自己的设计经验&#xff0c;与大家交流一下&#xff0c;如有错误还希望大家指出改正&#xff0c;谢谢&#xff08;V&#xff1a;Smt15921588263&#xff1b;愿与大家多交流&…

机器学习--线性回归

目录 监督学习算法 线性回归 损失函数 梯度下降 目标函数 更新参数 批量梯度下降 随机梯度下降 小批量梯度下降法 数据预处理 特征标准化 正弦函数特征 多项式特征的函数 数据预处理步骤 线性回归代码实现 初始化步骤 实现梯度下降优化模块 损失与预测模块 …

JVM启动流程(JDK8)

JVM启动流程(JDK8) JVM的启动入口是位于jdk/src/share/bin/java.c的JLI_Launch函数,其定义如下: int JLI_Launch(int argc, char ** argv, /* main argc, argc */int jargc, const char** jargv, /* java args */int appclassc, const char** appclass…

【2023年网络安全优秀创新成果大赛专刊】银行数据安全解决方案(天空卫士)

在2023年网络安全优秀创新成果大赛&#xff0c;成都分站中&#xff0c;天空卫士银行数据安全方案获得优秀解决方案奖。与此同时&#xff0c;天空卫士受信息安全杂志邀请&#xff0c;编写《银行数据安全解决方案》。12月6日&#xff0c;天空卫士编写的《银行数据安全解决方案》做…

SpringIOC之MethodBasedEvaluationContext

博主介绍&#xff1a;✌全网粉丝5W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…

逆波兰计算器的完整代码

前置知识&#xff1a; 将中缀表达式转为List方法&#xff1a; //将一个中缀表达式转成中缀表达式的List//即&#xff1a;(3042)*5-6 》[(, 30, , 42, ), *, 5, -, 6]public static List<String> toIndixExpressionList(String s) {//定义一个List&#xff0c;存放中缀表达…