设计模式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特点描述完全正确的一项。…...
AntimicroX完全指南:游戏手柄映射的艺术与科学
AntimicroX完全指南:游戏手柄映射的艺术与科学 【免费下载链接】antimicrox Graphical program used to map keyboard buttons and mouse controls to a gamepad. Useful for playing games with no gamepad support. 项目地址: https://gitcode.com/GitHub_Trend…...
RWKV7-1.5B-G1A快速上手:5分钟部署你的轻量级文本生成助手
RWKV7-1.5B-G1A快速上手:5分钟部署你的轻量级文本生成助手 1. 为什么选择RWKV7-1.5B-G1A 如果你正在寻找一个轻量级但功能强大的文本生成模型,RWKV7-1.5B-G1A绝对值得考虑。这个基于RWKV-7架构的模型在1.5B参数规模下展现了出色的性能,特别…...
Python 3.14 JIT架构深度拆解(含官方未发布IR层流程图+Hot Code Path决策树)
第一章:Python 3.14 JIT编译器演进背景与设计哲学Python 长期以来以解释执行和动态灵活性著称,但性能瓶颈在数值计算、实时服务与高吞吐系统中日益凸显。CPython 解释器的字节码执行模型虽稳定可靠,却难以突破单线程 GIL 与逐指令解释带来的固…...
Python安全开发之简易Xss检测工具(详细注释)
核心代码:import requests # requests 库 - HTTP 请求处理库 # 【常用功能】: # requests.get(url) - 发送 HTTP GET 请求 # requests.post(url, data) - 发送 HTTP POST 请求 # response.text - 获取响应体内容(字符串) #…...
简单介绍C语言中的字符串函数
1.首先给出字符分类函数这几个就简单过一下,不做重点说明。这两个为字符转换函数,顾名思义,没什么好介绍的;接下来简单介绍几个字符串函数:strlen.strcpy.strcat.strstr.strncpy.strncat.memcpy.memmove;strlen:求字符…...
避坑指南:PyTorch QAT模型部署时,你的推理结果为什么对不上?从量化参数到计算细节的排查思路
PyTorch QAT模型部署实战:量化推理结果异常的全链路诊断手册 当你的量化感知训练(QAT)模型在部署环节突然"翻车"——推理结果与训练时相差甚远,这种场景就像精心调制的咖啡在最后一刻被打翻。本文将带你深入量化模型的黑…...
nlp_structbert_sentence-similarity_chinese-large保姆级教学:模型路径自定义、多模型切换、Web界面汉化配置
nlp_structbert_sentence-similarity_chinese-large保姆级教学:模型路径自定义、多模型切换、Web界面汉化配置 1. 引言:为什么需要这个工具? 你是不是经常遇到这样的情况:需要判断两段中文文字是不是表达同一个意思,…...
Go语言中的Panic和Recover:错误处理的艺术
Go语言中的Panic和Recover:错误处理的艺术 1. Panic和Recover的基本概念 Panic和Recover是Go语言中用于处理异常情况的机制。Panic用于在程序遇到无法恢复的错误时终止程序,而Recover用于捕获Panic并恢复程序的正常执行。 Go语言的错误处理哲学是显式处理…...
告别桌面混乱:NoFences让文件管理效率提升80%的空间收纳方案
告别桌面混乱:NoFences让文件管理效率提升80%的空间收纳方案 【免费下载链接】NoFences 🚧 Open Source Stardock Fences alternative 项目地址: https://gitcode.com/gh_mirrors/no/NoFences 每天在杂乱的桌面图标中寻找文件,就像在堆…...
你在关系里是不是“管太多“?免费控制欲测试,评估你的占有程度
你在关系里是不是"管太多"?免费控制欲测试,评估你的占有程度 引言 你是否总是想知道伴侣在哪里、和谁在一起?是否经常查看对方的手机或社交账号?是否对伴侣和异性接触特别敏感? 还是你常常因为对方的某些…...
