设计模式Java实现-迭代器模式
✨这里是第七人格的博客✨小七,欢迎您的到来~✨
🍅系列专栏:设计模式🍅
✈️本篇内容: 迭代器模式✈️
🍱 本篇收录完整代码地址:https://gitee.com/diqirenge/design-pattern 🍱
楔子
很久没有更新文章了,一方面是工作比较忙,另一方面家里又迎来了新的小生命,短暂休整一下后,小七又决定出来卖艺了。今天我们聊一下迭代器模式。
需求背景
很多公司的组织架构都是树形结构,每一个节点都是一个部门,每一个部门包含很多员工,现在需要遍历这些员工,考虑使用树的深度遍历。
分析设计
在实现迭代器模式之前,我们可以先参考下 Java 中 List 类是如何实现迭代器的,类图如下

开发会按照这个模式来实现,这个模式主要分为以下⼏块;
- Collection,集合⽅法部分⽤于对⾃定义的数据结构添加通⽤⽅法; add 、 remove 、 iterator
等核⼼⽅法。
Iterable,提供获取迭代器,这个接⼝类会被 Collection 继承。
Iterator,提供了两个⽅法的定义; hasNext 、 next ,会在具体的数据结构中写实现⽅式。
UML图
根据分析设计,我们可以先画一个简单的UML图,后面通过UML图编码

模块名称
iterator
模块地址
https://gitee.com/diqirenge/design-pattern/tree/master/src/main/java/com/run2code/design/behavioral/iterator
模块描述
迭代器模式代码示例
代码实现
1、参考jdk的Iterator,编写迭代器接口
①、是否有下一个节点
②、获取下一个节点
/*** 迭代器接口,主要提供hasNext、next两个方法,参考jdk的Iterator设计* @see java.util.Iterator 接口* 关注公众号【奔跑的码畜】,一起进步不迷路** @author 第七人格* @date 2024/01/30*/
public interface Iterator<E> {boolean hasNext();E next();}
2、参考jdk的Iterable,编写Iterable,提供一个获取迭代器的方法
/*** 提供获取迭代器的方法,参考jdk的Iterable设计* @see java.lang.Iterable 接口* 关注公众号【奔跑的码畜】,一起进步不迷路** @author 第七人格* @date 2024/01/30*/
public interface Iterable<T> {Iterator<T> iterator();}
3、参考jdk的Collection,编写集合接口
该接口继承Iterable,拓展了基础的添加和删除方法
/*** 集合接口,参考jdk的Collection设计* @see java.util.Collection 接口* 关注公众号【奔跑的码畜】,一起进步不迷路** @author 第七人格* @date 2024/01/30*/
public interface Collection<E> extends Iterable<E> {boolean add(E e);boolean remove(E e);Iterator<E> iterator();}
4、编写员工类
/*** 员工类* 关注公众号【奔跑的码畜】,一起进步不迷路** @author 第七人格* @date 2024/01/30*/
public class Employee {private String name;private String position;public Employee(String name, String position) {this.name = name;this.position = position;}public String getName() {return name;}public String getPosition() {return position;}
}
5、编写组织类
实现Iterable接口,编写iterator()方法
/*** 组织类* 实现Iterable接口的iterator()方法,返回一个Iterator实例* 关注公众号【奔跑的码畜】,一起进步不迷路** @author 第七人格* @date 2024/01/30*/
public class Organization implements Iterable<Employee> {private List<Employee> employees;public Organization() {employees = new ArrayList<>();}public void addEmployee(Employee employee) {employees.add(employee);}@Overridepublic Iterator<Employee> iterator() {return new OrganizationIterator(employees);}}
6、编写组织器迭代类
主要完成hasNext和next两个方法的逻辑编写
/*** 组织迭代器类* 实现Iterator类,用于遍历组织结构中的员工。* 关注公众号【奔跑的码畜】,一起进步不迷路** @author 第七人格* @date 2024/01/30*/
public class OrganizationIterator implements Iterator<Employee> {private List<Employee> employees;private int currentIndex;public OrganizationIterator(List<Employee> employees) {this.employees = employees;currentIndex = 0;}@Overridepublic boolean hasNext() {return currentIndex < employees.size();}@Overridepublic Employee next() {return employees.get(currentIndex++);}
}
7、编写测试类
/*** 测试迭代器模式* 关注公众号【奔跑的码畜】,一起进步不迷路** @author 第七人格* @date 2024/01/30*/
public class IteratorTest {@Testpublic void testIterator() {Organization organization = new Organization();organization.addEmployee(new Employee("张三", "经理"));organization.addEmployee(new Employee("李四", "工程师"));organization.addEmployee(new Employee("王五", "设计师"));Iterator<Employee> iterator = organization.iterator();while (iterator.hasNext()) {Employee employee = iterator.next();System.out.println("姓名:" + employee.getName() + ",职位:" + employee.getPosition());}}
}
8、测试结果
姓名:张三,职位:经理
姓名:李四,职位:工程师
姓名:王五,职位:设计师
实现要点
迭代器模式实现要点如下:
- 抽象迭代器(Iterator):定义了遍历集合对象所需的接口,通常包括
hasNext()和next()方法,用于判断是否还有下一个元素以及获取下一个元素。 - 具体迭代器(Iterator):实现抽象迭代器接口的具体类,负责具体的遍历逻辑。它保存了当前遍历的位置信息,并可以根据需要向前或向后遍历集合元素。
- 聚合对象(Iterable):是迭代器模式的目标对象,通常是一个集合或容器,包含了多个元素。聚合对象提供创建具体迭代器的方法,以便外部可以通过迭代器访问其内部的元素。
- 隔离集合的遍历和实现:迭代器模式将集合的遍历方式与集合的内部表示分离,使得可以在不暴露集合内部结构的情况下访问集合中的元素。
- 增加遍历的灵活性:通过迭代器模式,可以灵活地为集合对象增加不同的遍历方法,而不需要修改集合对象的代码。
- 支持多种遍历方式:迭代器模式允许定义多种遍历方式,例如顺序遍历、逆序遍历等,只需要提供相应的具体迭代器实现即可。
- 简化外部操作:外部代码只需通过迭代器的接口与集合交互,无需关心集合的内部结构和遍历细节,简化了外部代码的复杂性。
总结
迭代器模式遵循开闭原则,对扩展开放,对修改封闭。当需要增加新的遍历方式时,只需添加新的具体迭代器类,无需修改现有代码。每个类只关注一项任务,也符合单一职责原则。
面对对象面对君,不负代码不负卿
相关文章:
设计模式Java实现-迭代器模式
✨这里是第七人格的博客✨小七,欢迎您的到来~✨ 🍅系列专栏:设计模式🍅 ✈️本篇内容: 迭代器模式✈️ 🍱 本篇收录完整代码地址:https://gitee.com/diqirenge/design-pattern 🍱 楔子 很久…...
单页源码加密屋zip文件加密API源码
简介: 单页源码加密屋zip文件加密API源码 api源码里面的参数已改好,往服务器或主机一丢就行,出现不能加密了就是加密次数达到上限了,告诉我在到后台修改加密次数 点击下载...
47.全排列
1.题目 47. 全排列 II - 力扣(LeetCode)https://leetcode.cn/problems/permutations-ii/description/ 2.思路 注意剪枝的条件 3.代码 class Solution {vector<int> path;vector<vector<int>> ret;bool check[9]; public:vector<…...
呼叫中心系统选pscc好还是okcc好
选择PSCC(商业软件呼叫中心)还是OKCC(开源呼叫中心),应基于以下几个关键因素来决定: 技术能力:如果企业拥有或愿意投入资源培养内部技术团队,开源解决方案可能更合适,因为…...
【SRC实战】前端脱敏信息泄露
挖个洞先 https://mp.weixin.qq.com/s/xnCQQCAneT21vYH8Q3OCpw “ 以下漏洞均为实验靶场,如有雷同,纯属巧合 ” 01 — 漏洞证明 一、前端脱敏,请求包泄露明文 “ 前端脱敏处理,请求包是否存在泄露? ” 1、获取验…...
区块链 | NFT 水印:Review on Watermarking Techniques(三)
🍍原文:Review on Watermarking Techniques Aiming Authentication of Digital Image Artistic Works Minted as NFTs into Blockchains 一个 NFT 的水印认证协议 可以引入第三方实体来实现对交易的认证,即通过使用 R S A \mathsf{RSA} RSA…...
初识C语言——第十九天
for循环 1.简单概述 2.执行流程 3.建议事项:...
软件需求工程习题
1.(面谈)是需求获取活动中发生的需求工程师和用户间面对面的会见。 2.使用原型法进行需求获取,(演化式)原型必须具有健壮性,代码质量要从一开始就能达到最终系统的要求 3.利用面谈进行需求获取时…...
Win10弹出这个:https://logincdn.msauth.ne
问题描述: Win10脚本错误 Windows10家庭版操作系统开机后弹出这个 https://logincdn.msauth.net/shared/1.0/content/js/ConvergedLogin_PCore_vi321_9jVworKN8EONYo0A2.js 解决方法: 重启计算机后手动关闭第三方安全优化软件,然后在任务管理…...
Vue2 动态路由
VUE CLI 项目 router.js import Vue from "vue"; import Router from "vue-router"; import base from "/view/404/404.vue";const originalPush Router.prototype.push Router.prototype.push function push (location) {return originalPu…...
LeetCode746:使用最小花费爬楼梯
题目描述 给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。 你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。 请你计算并返回达到楼梯顶部的最低花费。 代码 …...
DockerFile介绍与使用
一、DockerFile介绍 大家好,今天给大家分享一下关于 DockerFile 的介绍与使用,DockerFile 是一个用于定义如何构建 Docker 镜像的文本文件,具体来说,具有以下重要作用: 标准化构建:提供了一种统一、可重复…...
Java基础知识(六) 字符串
六 字符串 6.1 String字符串 1、String类对象创建 定义String类对象格式:** 1)String 字符串变量名“字符串常量”; 2)String 字符串变量名new String(字符串常量); 3)String 字符串变量名; 字符串变量名“字符串常…...
为什么跨境电商大佬都在自养号测评?看完你就懂了!
在跨境电商的激烈竞争中,各大平台如亚马逊、拼多多Temu、shopee、Lazada、wish、速卖通、煤炉、敦煌、独立站、雅虎、eBay、TikTok、Newegg、Allegro、乐天、美客多、阿里国际、沃尔玛、Nike、OZON、Target以及Joom等,纷纷成为商家们竞相角逐市场份额的焦…...
AtCoder Beginner Contest 353
A 题意:检查是否有比第一个数大的数 #include<bits/stdc.h>using namespace std;int main() {int n;cin>>n;int a;cin>>a;int f0;for(int i2;i<n;i){int k;cin>>k;if(k>a){cout<<i<<endl;f1;break;}}if(f0){cout<&l…...
深度解读《深度探索C++对象模型》之虚继承的实现分析和效率评测(一)
目录 前言 具有虚基类的对象的构造过程 通过子类的对象存取虚基类成员的实现分析 接下来我将持续更新“深度解读《深度探索C对象模型》”系列,敬请期待,欢迎左下角点击关注!也可以关注公众号:iShare爱分享,或文章末…...
计算机Java项目|Springboot房产销售系统
作者主页:编程指南针 作者简介:Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、腾讯课堂常驻讲师 主要内容:Java项目、Python项目、前端项目、人工智能与大数据、简…...
学习3D几何和特征一致的高斯溅射目标去除
earning 3D Geometry and Feature Consistent Gaussian Splatting for Object Removal 学习3D几何和特征一致的高斯溅射目标去除 Yuxin Wang 王玉欣 HKUST &Qianyi Wu Monash University &Guofeng Zhang Zhejiang University &Dan Xu HKUST 香港科技大学&吴倩…...
PHP 使用常量实现枚举类
PHP 使用常量实现枚举类 <?php abstract class Enum {private static $constCacheArray NULL;private static function getConstants() {if (self::$constCacheArray NULL) {self::$constCacheArray [];}$calledClass get_called_class();if (!array_key_exists($call…...
Linux操作系统基础题库
一. 单选题(共2题,40分) 1. (单选题)Linux操作系统自诞生至今,有数十万的程序开发人员参与到了它的开发与完善中,如今Linux已发展成为是一个成熟、稳定的操作系统。从以下选项中选出关于Linux特点描述完全正确的一项。…...
label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...
java 实现excel文件转pdf | 无水印 | 无限制
文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...
蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...
高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...
P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...
Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...
蓝桥杯 冶炼金属
原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...
