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

柯里蝉翼
• 阅读 46

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

🍅系列专栏:设计模式🍅

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

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

楔子

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

需求背景

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

分析设计

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

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

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

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

等核⼼⽅法。

  1. Iterable,提供获取迭代器,这个接⼝类会被 Collection 继承。
  2. Iterator,提供了两个⽅法的定义; hasNext 、 next ,会在具体的数据结构中写实现⽅式。

UML图

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

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

模块名称

iterator

模块地址

https://gitee.com/diqirenge/design-pattern/tree/master/src/ma...

模块描述

迭代器模式代码示例

代码实现

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);
    }

    @Override
    public 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;
    }

    @Override
    public boolean hasNext() {
        return currentIndex < employees.size();
    }

    @Override
    public Employee next() {
        return employees.get(currentIndex++);
    }
}

7、编写测试类

/**
 * 测试迭代器模式
 * 关注公众号【奔跑的码畜】,一起进步不迷路
 *
 * @author 第七人格
 * @date 2024/01/30
 */
public class IteratorTest {

    @Test
    public 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. 简化外部操作:外部代码只需通过迭代器的接口与集合交互,无需关心集合的内部结构和遍历细节,简化了外部代码的复杂性。

总结

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

面对对象面对君,不负代码不负卿
点赞
收藏
评论区
推荐文章
徐小夕 徐小夕
5年前
《前端实战总结》之迭代器模式的N+1种应用场景
眼看12月就来了,抓住今年的尾巴,好好总结一下前端的不足与收获。这篇文章是笔者写设计模式专题的第二篇文章,也是基于工作中的总结和提炼,在实际应用场景中都会大量使用,至于为什么要写设计模式,主要是为了提高团队代码质量和可维护性,后续会继续推出设计模式相关的文章,供大家参考和学习。你将学到迭代器模式的含义实现一个数组迭代器实现一个对象迭代器
徐小夕 徐小夕
5年前
《前端实战总结》之使用解释器模式实现获取元素Xpath路径的算法
前端领域里基于javascript的设计模式和算法有很多,在很多复杂应用中也扮演着很重要的角色,接下来就介绍一下javascript设计模式中的解释器模式,并用它来实现一个获取元素Xpath路径的算法。上期回顾《前端实战总结》之迭代器模式的N1种应用场景(https://juejin.im/post/6844904008616771591)
zdd小小菜鸟 zdd小小菜鸟
3年前
设计模式四大类型
设计模式四大类型重点!重点!重点!设计模式(Designpattern)是重构解决方案根据书DesignPatterns–ElementsofReusableObjectOrientedSoftware(中文
Wesley13 Wesley13
4年前
java24种设计模式
一、设计模式定义  设计模式(DesignPattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结,使用设计模式是为了可重用代码、让代码更容易被他人理解并且保证代码可靠性。二、设计模式分类  经典模式只有23个(还有简单工厂模式),它们各具特色,每个模式都为某一个可重复的设计问题提供了一套解决方案。  根据它们的用
zdd小小菜鸟 zdd小小菜鸟
3年前
设计模式简介
设计模式简介简介设计模式(Designpattern)是重构解决方案tex这点很重要,尤其是现在B/S一统天下的局面,过早考虑设计模式,得不偿失设计模式(Designpatt
Wesley13 Wesley13
4年前
MongoDB开发系列
本篇文章主要介绍数据集设计中的分桶范式以及使用实例。数据集设计模式,MongoDB在官方文档https://docs.mongodb.com/ecosystem/ 中的usecases部分提供了详细的参考内容。结合文档,本篇说一些比较深入的MongoDB使用分桶模式分桶模式是MongoDB数据集设计的一种范式。分桶buckets
Wesley13 Wesley13
4年前
Java 设计模式(1)
设计模式(Designpattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。项目中合理的运用设计模式可以完美的解决很多问题,每种
Wesley13 Wesley13
4年前
Java描述设计模式(13):迭代器模式
本文源码:GitHub·点这里(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fgithub.com%2Fcicadasmile%2Fmodelarithmeticparent)||GitEE·点这里(https://gitee.com/cicadasmile/modela
Wesley13 Wesley13
4年前
Java Design Patterns
java的设计模式大体上分为三大类:创建型模式(5种):工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式。结构型模式(7种):适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组合模式,享元模式。行为型模式(11种):策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模
Wesley13 Wesley13
4年前
Java开发中的23种设计模式详解(转)
设计模式(DesignPatterns)                                 ——可复用面向对象软件的基础设计模式(Designpattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。毫无疑问,设计模式于己于他
Wesley13 Wesley13
4年前
00_设计模式之语言选择
设计模式之语言选择设计模式简介背景设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。设计模式(Designpattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的