Java实现迭代器模式

一、简介

1、定义

  迭代器模式(Iterator Pattern)是一种面向集合对象而生的行为设计模式。对于集合对象而言,会涉及对集合的添加和删除操作,也要支持遍历集合元素的操作。可以把遍历操作放在集合对象中,但这样做,集合对象就承担太多的责任了。面向对象设计原则中有一条就是单一职责原则,所以要尽可能地分离这些职责,用不同的类承担不同的责任,迭代器模式就是用迭代器类来承担遍历集合的职责。
  迭代器模式提供了一种方法顺序访问一个集合对象中的各个元素,而又无需暴露该集合对象的内部实现,这样既可以做到不暴露集合对象的内部结构,又可让外部代码透明地访问集合内部的数据。

2、命令模式的结构

迭代模式涉及以下几个角色:
迭代器(Iterator)接口:定义访问和遍历集合元素的抽象方法,通常包含 hasNext()、next() 等方法。
具体迭代器(Concretelterator)类:实现迭代器接口中所定义的方法,完成对集合对象的遍历,记录遍历的当前位置。
聚合(Aggregate)类:构建集合数据,返回一个具体迭代器的实例。
客户端(Client)类:调用聚合类,维护集合对象,通过迭代器遍历集合对象。

二、Java实现案例

1、概念实现案例

/*** @Description: 迭代器接口* @Date: 2025-01-10 10:41* @Author: gaoyufei**/
public interface Iterator {boolean hasNext();Object next();
}import java.util.List;
/*** @Description: 具体迭代器类* @Date: 2025-01-10 10:42* @Author: gaoyufei**/
public class ConcreteIterator implements Iterator{private List<Object> items;private int position;public ConcreteIterator(List<Object> items){this.items=items;}@Overridepublic boolean hasNext() {return position<items.size();}@Overridepublic Object next() {return items.get(position++);}
}import java.util.ArrayList;
import java.util.List;
/*** @Description: 聚合类* @Date: 2025-01-10 10:46* @Author: gaoyufei**/
public class Aggregate {private List<Object> items=new ArrayList<>();public void add(Object item){items.add(item);}public Iterator iterator(){return new ConcreteIterator(items);}
}/*** @Description: 客户端* @Date: 2025-01-10 10:48* @Author: gaoyufei**/
public class Client {public static void main(String[] args) {Aggregate aggregate=new Aggregate();aggregate.add("item 1");aggregate.add("item 2");Iterator iterator = aggregate.iterator();while (iterator.hasNext()){System.out.println(iterator.next());}}
}

2、书架遍历案例

/*** @Description: 书* @Date: 2025-01-10 13:07* @Author: gaoyufei**/
public class Book {private String name;public Book(String name){this.name=name;}public String getName() {return name;}public void setName(String name) {this.name = name;}
}/*** @Description: 迭代器接口* @Date: 2025-01-10 13:08* @Author: gaoyufei**/
public interface Iterator<E> {boolean hasNext();E next();
}/*** @Description: 书架迭代器类* @Date: 2025-01-10 13:10* @Author: gaoyufei**/
public class BookShelfIterator implements Iterator{private BookShelf bookShelf;private int index;public BookShelfIterator(BookShelf bookShelf){this.bookShelf=bookShelf;this.index=0;}@Overridepublic boolean hasNext() {return index<bookShelf.getBooks().size();}@Overridepublic Book next() {return bookShelf.getBooks().get(index++);}
}import java.util.ArrayList;
import java.util.List;
/*** @Description: 书架(聚合类)* @Date: 2025-01-10 13:12* @Author: gaoyufei**/
public class BookShelf {private List<Book> books=new ArrayList<>();public void add(Book book){books.add(book);}public List<Book> getBooks() {return books;}public void setBooks(List<Book> books) {this.books = books;}public Iterator iterator(){return new BookShelfIterator(this);}
}/*** @Description: 客户端* @Date: 2025-01-10 13:14* @Author: gaoyufei**/
public class Client {public static void main(String[] args) {BookShelf bookShelf=new BookShelf();bookShelf.add(new Book("思考致富"));bookShelf.add(new Book("思考,快与慢"));Iterator iterator = bookShelf.iterator();while (iterator.hasNext()){Book book = (Book)iterator.next();System.out.println(book.getName());}}
}

3、班级学生遍历案例

import java.util.Objects;/*** @Description: 学生类* @Date: 2025-01-10 13:42* @Author: gaoyufei**/
public class Student {private String name;public Student(String name) {this.name = name;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Student student = (Student) o;return Objects.equals(name, student.name);}@Overridepublic int hashCode() {return Objects.hash(name);}
}/*** @Description: 迭代器接口* @Date: 2025-01-10 13:43* @Author: gaoyufei**/
public interface Iterator<E> {boolean hasNext();E next();
}import java.util.List;
/*** @Description: 学生迭代器实现* @Date: 2025-01-10 13:44* @Author: gaoyufei**/
public class StudentIterator implements Iterator{private List<Student> students;private int position;public StudentIterator(List<Student> students){this.students=students;this.position=0;}@Overridepublic boolean hasNext() {return position<students.size();}@Overridepublic Object next() {return students.get(position++);}
}import java.util.ArrayList;
import java.util.List;
/*** @Description: 班级* @Date: 2025-01-10 13:47* @Author: gaoyufei**/
public class StudentClass {private List<Student> students=new ArrayList<>();public void add(Student student){this.students.add(student);}public void remove(Student student) {students.remove(student);}public Iterator iterator(){return new StudentIterator(students);}
}/*** @Description: 客户端* @Date: 2025-01-10 13:50* @Author: gaoyufei**/
public class Client {public static void main(String[] args) {StudentClass studentClass=new StudentClass();studentClass.add(new Student("张三"));studentClass.add(new Student("李四"));studentClass.add(new Student("王五"));studentClass.remove(new Student("王五"));Iterator<Student> iterator = studentClass.iterator();while (iterator.hasNext()){System.out.println(iterator.next().getName());}}
}

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

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

相关文章

uniapp中h5使用地图

export function loadTMap(key) {return new Promise(function(resolve, reject) {window.init function() {// resolve(qq) //注意这里resolve(TMap) //注意这里}var script document.createElement("script");script.type "text/javascript";// scrip…

获取地图文档中的图层列表

大多数情况下,获取地图文档中的图层列表是地理处理脚本中的首要工作之一.获取图层列表后,脚本可以循环遍历每个图层并执行某些类型的处理.制图模块中的ListLayers()函数提供获取图层列表的功能.本节将学习如何获得地图文档中的图层列表. 操作方法: 1.在arcgis中打开地图文件 …

软件系统安全逆向分析-混淆对抗

1. 概述 在一般的软件中&#xff0c;我们逆向分析时候通常都不能直接看到软件的明文源代码&#xff0c;或多或少存在着混淆对抗的操作。下面&#xff0c;我会实践操作一个例子从无从下手到攻破目标。 花指令对抗虚函数表RC4 2. 实战-donntyousee 题目载体为具有漏洞的小型软…

#渗透测试#网络安全# 一文了解什么是跨域CROS!!!

免责声明 本教程仅为合法的教学目的而准备&#xff0c;严禁用于任何形式的违法犯罪活动及其他商业行为&#xff0c;在使用本教程前&#xff0c;您应确保该行为符合当地的法律法规&#xff0c;继续阅读即表示您需自行承担所有操作的后果&#xff0c;如有异议&#xff0c;请立即停…

【权限管理】Apache Shiro学习教程

Apache Shiro 是一个功能强大且灵活的安全框架&#xff0c;主要用于身份认证&#xff08;Authentication&#xff09;、授权&#xff08;Authorization&#xff09;、会话管理&#xff08;Session Management&#xff09;和加密&#xff08;Cryptography&#xff09;。它旨在为…

Spring事件发布与监听

Spring事件机制详解&#xff1a;事件发布与监听 在Spring框架中&#xff0c;事件机制基于发布-订阅模式&#xff0c;允许组件之间进行解耦。发布者发布事件&#xff0c;监听者订阅并响应这些事件。Spring事件机制的核心在于ApplicationEvent和ApplicationListener&#xff0c;…

ClickHouse vs StarRocks 选型对比

一、面向列存的 DBMS 新的选择 Hadoop 从诞生已经十三年了&#xff0c;Hadoop 的供应商争先恐后的为 Hadoop 贡献各种开源插件&#xff0c;发明各种的解决方案技术栈&#xff0c;一方面确实帮助很多用户解决了问题&#xff0c;但另一方面因为繁杂的技术栈与高昂的维护成本&…

Win11家庭版转专业版

Win11家庭版转专业版&#xff08;亲测有效&#xff09; 第一步 【断网】输入这个密钥&#xff1a; R8NJ8-9X7PV-C7RCR-F3J9X-KQBP6 第二步 点击下一步会自动重启 第三步 【联网】输入这个密钥&#xff1a; F3NWX-VFMFC-MHYYF-BCJ3K-QV66Y 注意 两次输入密钥的地方一致 …

TypeScript语言的网络编程

TypeScript语言的网络编程 引言 在现代软件开发中&#xff0c;网络编程是一个不可或缺的部分。随着互联网的快速发展&#xff0c;网络应用程序越来越普遍&#xff0c;涉及到从简单的个人网站到复杂的企业级应用。TypeScript作为一种强类型的JavaScript超集&#xff0c;近年来…

在高德地图上加载3DTilesLayer图层模型/天地瓦片

1. 引入必要的库 Three.js&#xff1a;一个用于创建和显示3D图形的JavaScript库。vuemap/three-layer&#xff1a;一个Vue插件&#xff0c;它允许你在高德地图中添加Three.js图层。vuemap/layer-3dtiles&#xff1a;一个用于处理3D Tiles格式数据的Vue插件&#xff0c;可以用来…

Linux 高级路由 —— 筑梦之路

Linux 高级路由详解 本文将基于您提供的 Linux 高级路由极简教程 文章&#xff0c;深入探讨 Linux 高级路由的概念、配置方法以及应用场景。 一、什么是 Linux 高级路由&#xff1f; Linux 高级路由是指利用 Linux 内核提供的强大网络功能&#xff0c;实现超越传统路由表和默…

IP 地址与蜜罐技术

基于IP的地址的蜜罐技术是一种主动防御策略&#xff0c;它能够通过在网络上布置的一些看似正常没问题的IP地址来吸引恶意者的注意&#xff0c;将恶意者引导到预先布置好的伪装的目标之中。 如何实现蜜罐技术 当恶意攻击者在网络中四处扫描&#xff0c;寻找可入侵的目标时&…

【Word_笔记】Word的修订模式内容改为颜色标记

需求如下&#xff1a;请把修改后的部分直接在原文标出来&#xff0c;不要采用修订模式 步骤1&#xff1a;打开需要转换的word后&#xff0c;同时按住alt和F11 进入&#xff08;Microsoft Visual Basic for Appliations&#xff09; 步骤2&#xff1a;插入 ---- 模块 步骤3&…

[0405].第05节:搭建Redis主从架构

Redis学习大纲 一、3主3从的集群配置&#xff1a; 1.1.集群规划 1.分片集群需要的节点数量较多&#xff0c;这里我们搭建一个最小的分片集群&#xff0c;包含3个master节点&#xff0c;每个master包含一个slave节点&#xff0c;结构如下&#xff1a; 2.每组是一主一从&#x…

科研绘图系列:R语言绘制分组箱线图(boxplot)

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍加载R包数据下载导入数据数据预处理画图输出系统信息介绍 科研绘图系列:R语言绘制分组箱线图(boxplot) 加载R包 library(ggpubr) library(ggplot2) library(tidyverse) # dev…

Hadoop - MapReduce编程

文章目录 前言一、创建mapreduce-demo项目1. 在idea上创建maven项目2. 导入hadoop相关依赖 二、MapReduce编程1. 相关介绍1.1 驱动类&#xff08;Driver Class&#xff09;1.1.1 驱动类的定义1.1.2 驱动类的功能1.1.3 驱动类的作用 1.2 Mapper1.2.1 Mapper 的定义1.2.2 Mapper …

原码的乘法运算>>>只有0,1

MQ : 乘数 X : 被乘数 ACC : 乘积高位 [当前位是1,加上被乘数; 当前位是 0,加上0] 例如: MQ的最低位是1,所以要加上被乘数(01101) >>>> 得出 01101 >>>>> ACC MQ 需要整体逻辑右移 (原本01101 01011 >>> 001101 0101) 现在的次低位是…

第四、五章图论和网络爬虫+网络搜索

第四章 图论和网络爬虫 4.1 构建网络爬虫工程重点 构建网络爬虫的重点 用BFS还是DFS 在不考虑时间的情况下&#xff0c;这两种不同的搜索方法都可以在相同的时间下爬下整个静态的互联网内容&#xff0c;但是在现实中肯定是需要考虑时间以及互联网动态变化的。所以重点应该是如…

mapbox基础,style样式汇总,持续更新

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;mapbox 从入门到精通 文章目录 一、&#x1f340;前言二、&#x1f340;根属性2.1 so…

《通过财报看企业》

“借贷关系”“净资产收益率”“财务报表”、净利润、盈利能力、现金流 第1章 净利润&#xff1a;决定一家公司的股价能涨多高 企业经营&#xff1a;存货周转率 企业市值&#xff1a;市值净利润市盈率 龙头企业&#xff1a;行业内收入规模最大、盈利能力最强&#xff0c;…