迭代器模式:理解与实践

article/2025/10/3 15:39:34

本文收录于JavaStarter ,里面有我完整的Java系列文章,学习或面试都可以看看

(一)什么是迭代器模式

迭代器模式应该是23种设计模式中,程序员最容易理解的设计模式了,因为迭代器模式在日常的开发过程中经常使用到。以最常见的循环为例:

for(int i=0;i<arr.length;i++){System.out.print(arr[i]);
}

上面的这段代码通过循环逐一将arr的下标加1,从而实现了遍历数组的功能。

但是通过循环实现遍历的话依赖于集合对象内部,因此就有了一种能顺序访问集合对象中各个元素,又无需依赖对象内部表示的设计模式–迭代器模式。

(二)迭代器模式中的角色

迭代器模式中的角色主要有4种:

1、迭代器接口(Iterator):定义访问和遍历集合元素的接口,一般包含next()和hasNext()方法。

2、具体迭代器(ConcreteIterator):该角色用于实现迭代器接口,迭代器的核心遍历逻辑在这里实现。

3、集合接口(Aggregate):集合接口定义了创建迭代器的接口方法,内部定义了iterator方法。

4、具体集合(ConcreteAggregate):该角色用于实现集合接口,他会创建出具体的Iterator角色。

看到这里如果你觉得比较疑惑不要紧,下面会通过代码的方式来加深理解。

(三)迭代器模式的代码实现

首先说一下这段代码的场景,定义了一个教室的类,又定义了学生的类,实现遍历教室中学生的功能。

代码列表如下:

interface Aggregate:集合接口
interface Iterator:迭代器接口
class Classroom:教室类,实现集合接口,属于具体的集合
class ClassroomIterator:教室迭代器,实现迭代器接口,属于具体的迭代器
class Student:学生类

首先把迭代器模式中的两个接口角色定义出来:

public interface Aggregate {Iterator iterator();
}public interface Iterator {boolean hasNext();Object next();
}

接着定义学生类:

@Data
@AllArgsConstructor
public class Student {private String name;
}

接着定义教室类,在教室类中我们定义了Student集合,以及当前的集合长度和最大长度。同时实现Aggregate接口的iterator方法,这个方法将会返回一个迭代器对象。这个迭代器对象由ClassroomIterator提供

public class Classroom implements Aggregate{private Student[] students;private int length=0;private int maxSize;public Classroom(int maxSize){this.maxSize=maxSize;students=new Student[maxSize];}public Student getStudent(int index){return students[index];}public boolean addStudent(Student student){if (length>=maxSize){return false;}this.students[length]=student;length++;return true;}public int getLength(){return this.length;}@Overridepublic Iterator iterator() {return new ClassroomIterator(this);}
}

最后就是ClassroomIterator对象了,ClassroomIterator属于迭代器的具体实现,这里需要实现hasNext方法和next方法

public class ClassroomIterator implements Iterator{private Classroom classroom;private int index;public ClassroomIterator(Classroom classroom){this.classroom=classroom;this.index=0;}@Overridepublic boolean hasNext() {if (this.index<classroom.getLength()){return true;}return false;}@Overridepublic Object next() {Student student = classroom.getStudent(index);index++;return student;}
}

最后就是使用了,通过迭代器对象,我们可以直接遍历classroom对象:

public static void main(String[] args) {Classroom classroom=new Classroom(3);classroom.addStudent(new Student("张三"));classroom.addStudent(new Student("李四"));classroom.addStudent(new Student("王五"));Iterator iterator = classroom.iterator();while (iterator.hasNext()){Student next = (Student) iterator.next();System.out.println(next.getName());}
}

(四)迭代器模式的作用

看到这里很多人可能会有疑问,写了一堆,用循环不是更方便吗?迭代器模式最大的作用是将遍历和具体的实现分开,以上面的测试方法为例,遍历时我们始终只用到了iterator对象,而没有用到classroom,这就意味着我们之后可以完全复用这段代码实现遍历。

另一方面,如果我们发现在classroom里使用数组存储student,后续无法扩容,想改为List集合,这个时候我们只需要修改ClassroomIterator和Classroom这两个具体实现角色即可。而不用对使用中的代码做任何修改,就比如上面这段测试遍历代码不需要任何变动。如果用的是for循环或者while循环,就意味着所有用到循环的地方都需要修改代码。

(五)迭代器模式在源码中的应用

迭代器模式的应用我们在敲代码时肯定都用过,迭代器模式最佳实践就是JDK中Iterator接口的设计

public interface Iterator<E> {boolean hasNext();E next();default void remove() {throw new UnsupportedOperationException("remove");}default void forEachRemaining(Consumer<? super E> action) {Objects.requireNonNull(action);while (hasNext())action.accept(next());}
}

具体的迭代器实现最常用的就是集合,随便找个ArrayList看一下源码:

整体的实现逻辑和我们上面实现的基本上十分相似。

(五)总结

在学习设计模式的时候,会慢慢开始理解为什么要设计接口,而不是直接写各种类。如果用具体的类去解决一个个需求,就会导致类之间的强依赖,这些类也难以被拆分出来作为组件复用。我是鱼仔,我们下期再见!


http://chatgpt.dhexx.cn/article/cf8XOt07.shtml

相关文章

C#设计模式之迭代器模式

迭代器模式 文章目录 迭代器模式模式分类模式产生的原因模式的灵感来源模式类图代码实现迭代器模式总结迭代器模式的优点&#xff1a;迭代器模式的缺点&#xff1a; 本篇博客将介绍迭代器模式&#xff0c;迭代器模式将一个聚合对象保存数据的职责&#xff0c;和它遍历数据的职责…

迭代器模式实例与代码分析

目录 前言 一、&#x1f30d;迭代器&#xff08;Iterator&#xff09;模式是什么&#xff1f;&#x1f30d; 二、&#x1f30d;迭代器&#xff08;Iterator&#xff09;模式的优缺点&#x1f30d; 三、&#x1f30d;迭代器&#xff08;Iterator&#xff09;模式的结构&…

设计模式作业 之迭代器模式

设计一个逐页迭代器,每次可返回指定个数(一页)元素,并将该迭代器用手对数据进行分页处理。绘制对应的类图并编程模拟实现。 &#xff08;1&#xff09;绘制类图 &#xff08;2&#xff09;代码实现 AbstractAggregate类&#xff1a; package lib6.iterator;public interface…

迭代器模式讲解

学习设计模式&#xff0c;让你提升百倍 专栏重点文章设计模式设计模式基础前奏&#xff08;上&#xff09;设计模式设计模式基础前奏&#xff08;下&#xff09;设计模式创建者模式之单例模式设计模式创建者模式之工厂模式设计模式创建者模式之原型模式设计模式创建者模式之建…

设计模式之迭代器模式(十三)

目录 1. 背景 1.1 学院展示问题 1.2 迭代器模式概述 2. 迭代器模式 2.1 迭代器解决院校展示 2.2 迭代器模式在JDK ArrayList中的应用 1. 背景 1.1 学院展示问题 编写程序展示一个学校院系结构&#xff1a;需求是这样&#xff0c;要在一个页面中展示出学校的院系 组成&am…

设计模式——迭代器模式(附代码示例)

一. 传统方式 以学校院系展示为例&#xff0c;实现在一个页面展示学校的院系组成&#xff0c;一个学校有多个学院&#xff0c;一个学院有多个系。传统方式实现类图如下&#xff1a; 传统方式将学院看做是学校的子类&#xff0c;系是学院的子类&#xff0c;这样实际上是站在组织…

C++设计模式(20)——迭代器模式

亦称&#xff1a; Iterator 意图 迭代器模式是一种行为设计模式&#xff0c; 让你能在不暴露集合底层表现形式 &#xff08;列表、 栈和树等&#xff09; 的情况下遍历集合中所有的元素。 问题 集合是编程中最常使用的数据类型之一。 尽管如此&#xff0c; 集合只是一组对…

迭代器模式 - Unity

文章目录 迭代器模式结构实现应用场景优缺点与其他模式的关系 迭代器模式 迭代器模式是对象行为型模式&#xff0c;它提供一个对象来顺序访问聚合对象中的元素&#xff08;遍历元素的算法&#xff09;&#xff0c;且不暴露底层实现。 集合是编程中非常常见的数据结构之一。对…

迭代器模式(C++实现)

迭代器模式 1.定义2.迭代器模式的相关组成抽象聚合类具体聚合类抽象迭代器类具体迭代器类 3.代码实现运行结果演示 4.优缺点 1.定义 提供一种顺序访问集合内元素的方法&#xff0c;但不暴露集合内部实现细节的设计模式&#xff0c;属于行为型设计模式. 迭代器模式将数据的存储…

设计模式之迭代器模式

迭代器模式是一种行为设计模式&#xff0c; 让你能在不暴露集合底层表现形式 &#xff08;列表、 栈和树等&#xff09; 的情况下遍历集合中所有的元素。 集合是编程中最常使用的数据类型之一。 尽管如此&#xff0c; 集合只是一组对象的容器而已。大部分集合使用简单列表存储…

Java设计模式之行为型:迭代器模式

一、什么是迭代器模式&#xff1a; 实际开发中&#xff0c;我们针对不同的需求&#xff0c;可能需要以不同的方式来遍历整个整合对象&#xff0c;但我们不希望在集合容器的抽象接口层中充斥着各种不同的遍历操作&#xff0c;这时候我们就需要一种能完成下面功能的迭代器&#x…

迭代器模式

一、迭代器模式 1、定义 迭代器模式&#xff08;Iterator Pattern&#xff09;又称作游标模式&#xff08;Cursor Pattern&#xff09;,它提供一种按顺序访问集合/聚合/容器对象元素的方法&#xff0c;而又无须暴露集合内部表示。迭代器模式可以为不同的容器提供一致的遍历行为…

设计模式——迭代器模式

迭代器模式 1.迭代器模式动机及定义 1.1模式动机 聚合对象用于存储多个对象&#xff0c;在软件开发中应用广泛&#xff0c;为了更加方便地操作聚合对象&#xff0c;在很多编程语言中都提供了迭代器&#xff08;Iterator&#xff09;,迭代器本身也是一个对象&#xff0c;它的工…

【设计模式】迭代器模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

文章目录 一、迭代器模式简介二、迭代器模式适用场景三、迭代器模式优缺点四、迭代器模式和访问者模式五、迭代器模式代码示例1、迭代器接口2、迭代器实现3、集合元素实例类4、集合管理接口5、集合管理实现类6、测试类 一、迭代器模式简介 迭代器模式 : 提供一种方法 , 顺序访问…

SOME/IP报文格式-Payload

Payload [variable size] In the payload field the parameters are carried. Parameter被携带于Payload字段中 。The size of the SOME/IP payload field depends on the transport protocol used. With UDP the SOME/IP payload shall be between 0 and 1400 Bytes. The lim…

IP协议数据报格式详解

&#x1f431;‍&#x1f3cd;写博客的主要原因是为了巩固所学知识 &#x1f431;‍&#x1f3cd; IP数据报格式 4位版本号(Version) 由4比特组成&#xff0c;用来指定IP协议的版本。IPv4的版本号为4&#xff0c;即0100。 4位首部长度(Header Length) 由4比特组成&#xff0c;表…

IP数据报文格式

【转载】http://blog.csdn.net/shinezhang86/article/details/47145907 由于记性不好的原因, 一直对报文格式的字段记的不是很牢固, 故花了一天时间学习IP报文格式, 第二天来总结. 过两天再继续学习TCP和UDP. IP报文格式如下图所示(图片来源—百度百科): 版本(Version, 4bit):为…

IPv6报文格式

IPv6报文 IPv6报文分为两大部分&#xff1a;报头&#xff0c;负载。 报头 IPv6的报头是固定的320bit&#xff0c;不同与IPv4&#xff0c;IPv6把可选项从标准头部中移除&#xff0c;标准头部包含着版本号、流量类型、流标签、负载数据的长度、下一协议报头、生存时间&#xff08…

IP 协议报文格式 【IPv4】

前言: IP 数据报文由首部&#xff08;称为报头&#xff09;和数据两部分组成&#xff1b;首部的前一部分是固定长度&#xff0c;共 20 字节&#xff0c;是所有 IP 数据报必须具有的&#xff1b;在首部的固定部分的后面是一些可选字段&#xff0c;其长度是可变的 每个 IP 数据报…

TCP和UDP以及IP报文格式

TCP和UDP以及IP报文格式 TCP报文&#xff1a; 源端口&#xff1a; 数据发送方的端口号。 目的端口&#xff1a; 数据接受方的端口号。 序号&#xff1a;本数据报文中的的第一个字节的序号&#xff08;在数据流中每个字节都对应一个序号&#xff09;。 确认号&#xff1a;希望…