设计模式Java实现-迭代器模式

✨这里是第七人格的博客✨小七,欢迎您的到来~✨

🍅系列专栏:设计模式🍅

✈️本篇内容: 迭代器模式✈️

🍱 本篇收录完整代码地址:https://gitee.com/diqirenge/design-pattern 🍱

楔子

很久没有更新文章了,一方面是工作比较忙,另一方面家里又迎来了新的小生命,短暂休整一下后,小七又决定出来卖艺了。今天我们聊一下迭代器模式。

需求背景

很多公司的组织架构都是树形结构,每一个节点都是一个部门,每一个部门包含很多员工,现在需要遍历这些员工,考虑使用树的深度遍历。

分析设计

在实现迭代器模式之前,我们可以先参考下 Java 中 List 类是如何实现迭代器的,类图如下

file

开发会按照这个模式来实现,这个模式主要分为以下⼏块;

  1. Collection,集合⽅法部分⽤于对⾃定义的数据结构添加通⽤⽅法; add 、 remove 、 iterator

等核⼼⽅法。

  1. Iterable,提供获取迭代器,这个接⼝类会被 Collection 继承。

  2. Iterator,提供了两个⽅法的定义; hasNext 、 next ,会在具体的数据结构中写实现⽅式。

UML图

根据分析设计,我们可以先画一个简单的UML图,后面通过UML图编码

file

模块名称

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、测试结果

姓名:张三,职位:经理

姓名:李四,职位:工程师

姓名:王五,职位:设计师

实现要点

迭代器模式实现要点如下:

  1. 抽象迭代器(Iterator):定义了遍历集合对象所需的接口,通常包括hasNext()next()方法,用于判断是否还有下一个元素以及获取下一个元素。
  2. 具体迭代器(Iterator):实现抽象迭代器接口的具体类,负责具体的遍历逻辑。它保存了当前遍历的位置信息,并可以根据需要向前或向后遍历集合元素。
  3. 聚合对象(Iterable):是迭代器模式的目标对象,通常是一个集合或容器,包含了多个元素。聚合对象提供创建具体迭代器的方法,以便外部可以通过迭代器访问其内部的元素。
  4. 隔离集合的遍历和实现:迭代器模式将集合的遍历方式与集合的内部表示分离,使得可以在不暴露集合内部结构的情况下访问集合中的元素。
  5. 增加遍历的灵活性:通过迭代器模式,可以灵活地为集合对象增加不同的遍历方法,而不需要修改集合对象的代码。
  6. 支持多种遍历方式:迭代器模式允许定义多种遍历方式,例如顺序遍历、逆序遍历等,只需要提供相应的具体迭代器实现即可。
  7. 简化外部操作:外部代码只需通过迭代器的接口与集合交互,无需关心集合的内部结构和遍历细节,简化了外部代码的复杂性。

总结

迭代器模式遵循开闭原则,对扩展开放,对修改封闭。当需要增加新的遍历方式时,只需添加新的具体迭代器类,无需修改现有代码。每个类只关注一项任务,也符合单一职责原则。

面对对象面对君,不负代码不负卿

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

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

相关文章

JavaScript数字(Number)个数学(Math)对象

目录 前言&#xff1a; Number&#xff08;数字&#xff09;对象 前言&#xff1a; nfinity(正负无穷大)&#xff1a; NaN&#xff08;非数字&#xff09;&#xff1a; Number的属性 Number的方法 构造函数 静态方法 实例方法 Math&#xff08;数学&#xff09;对象…

C#之partial关键字

在C#中&#xff0c;partial关键字用于声明一个类、结构体、接口或方法的分部定义。这意味着可以将一个类或其他类型的定义分成多个部分&#xff0c;这些部分可以在同一个命名空间或程序集中的多个源文件中进行定义。当编译器编译这些部分时&#xff0c;会将它们合并成一个单独的…

字符串函数(一):strcpy(拷贝),strcat(追加),strcmp(比较),及strncpy,strncat,strncmp

字符串函数 一.strcpy&#xff08;字符串拷贝&#xff09;1.函数使用2.模拟实现 二.strcat&#xff08;字符串追加&#xff09;1.函数使用2.模拟实现 三.strcmp&#xff08;字符串比较&#xff09;1.函数使用2.模拟实现 四.strncpy1.函数使用2.模拟实现 五.strncat1.函数使用2.…

Vulnhub-wp 获取vulnhub靶机wp搜索工具

项目地址:https://github.com/MartinxMax/vulnhub-wp 简介 搜索Vulnhub平台的解题文章,之过滤返回出正确可访问的页面 使用 $ python3 vulnhubwp.py 支持模糊搜索 [] Query: kiop 进入选项4,获取wp地址 [] Choice options: 4

draw.io 网页版二次开发(1):源码下载和环境搭建

目录 一 说明 二 源码地址以及下载 三 开发环境搭建 1. 前端工程地址 2. 配置开发环境 &#xff08;1&#xff09;安装 node.js &#xff08;2&#xff09;安装 serve 服务器 3. 运行 四 最后 一 说明 应公司项目要求&#xff0c;需要对draw.io进行二次开发&…

java spring boot动态数据库获得配置信息连接多数据源(数据库)

数据库 数据库文件和代码文件 https://download.csdn.net/download/qq_34631220/89304173 链接&#xff1a;https://pan.baidu.com/s/1xoh6xiSRx4nW_gKvR1QPjg 提取码&#xff1a;i7b7 –来自百度网盘超级会员V5的分享 文章位置 添加链接描述 说明&#xff1a;事务只能单库…

☀☀☀☀☀☀☀有关栈和队列应用的oj题讲解☼☼☼☼☼☼☼

准备好了么 目录&#xff1a; 一用两个队列实现栈&#xff1a; 1思路&#xff1a; 2画图理解&#xff1a; 3代码解答&#xff1a; 二用两个栈实现队列&#xff1a; 1思路&#xff1a; 2画图理解&#xff1a; 3代码解答&#xff1a; 三设计循环队列&#xff1a; 1思路…

单页源码加密屋zip文件加密API源码

简介&#xff1a; 单页源码加密屋zip文件加密API源码 api源码里面的参数已改好&#xff0c;往服务器或主机一丢就行&#xff0c;出现不能加密了就是加密次数达到上限了&#xff0c;告诉我在到后台修改加密次数 点击下载

卓豪Zoho CRM怎么收费?多少钱一年?

卓豪Zoho CRM作为一款功能强大且高度可定制的企业级客户关系管理系统&#xff0c;其收费标准因版本不同而有所差异&#xff0c;旨在满足不同规模及需求的企业。Zoho CRM提供多种套餐选择&#xff0c;包括但不限于免费版、标准版、专业版、企业版以及旗舰版。每种版本都包含了核…

leetcode-缺失的第一个正整数-96

题目要求 思路 1.这里的题目要求刚好符合map和unordered_map 2.创建一个对应map把元素添加进去&#xff0c;用map.find(res)进行查找&#xff0c;如果存在返回指向该元素的迭代器&#xff0c;否则返回map::end()。 代码实现 class Solution { public:int minNumberDisappeare…

CANopen总线_CANOpen开源协议栈

CANopen是自动化中使用的嵌入式系统的通信协议栈和设备配置文件规范。就OSI 模型而言&#xff0c;CANopen 实现了以上各层&#xff0c;包括网络层。 CANopen 标准由一个寻址方案、几个小型通信协议和一个由设备配置文件定义的应用层组成。通信协议支持网络管理、设备监控和节点…

C++11智能指针之一(简介)

1 概述 从C11开始C语言越来向现代化语言转变。尤其是智能指针的引入&#xff0c;代码中不会直接使用new/delete了。C11智能指针有三种分别是&#xff1a;shared_ptr&#xff0c;weak_ptr 和unique_ptr 。 2 类图 3 共享指针(shared_ptr) 接口函数&#xff1a; shared_ptr 构…