行为型模式-迭代器模式

news2025/4/12 11:47:11

1.概述

定义:提供一个对象来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示。

2.结构

迭代器模式主要包含以下角色:

  • 抽象聚合(Aggregate)角色:定义存储、添加、删除聚合元素以及创建迭代器对象的接口。
  • 具体聚合(ConcreteAggregate)角色:实现抽象聚合类,返回一个具体迭代器的实例。
  • 抽象迭代器(Iterator)角色:定义访问和遍历聚合元素的接口,通常包含 hasNext()、next() 等方法。
  • 具体迭代器(Concretelterator)角色:实现抽象迭代器接口中所定义的方法,完成对聚合对象的遍历,记录遍历的当前位置。

3.案例实现

【例】定义一个可以存储学生对象的容器对象,将遍历该容器的功能交由迭代器实现,涉及到的类如下:

在这里插入图片描述
代码如下

package com.itheima.pattern.iterator;

/**
 * @program: design-patterns
 * @ClassName StudentAggregate
 * @description: 抽象聚合角色类
 * @author: 
 * @create: 2023-01-27 17:27
 * @Version 1.0
 **/
public interface StudentAggregate {
    // 添加学生功能
    void addStudent(Student student);

    // 删除学生功能
    void removeStudent(Student student);

    // 获取迭代器对象功能
    StudentIterator getStudentIterator();
}
package com.itheima.pattern.iterator;

import java.util.ArrayList;
import java.util.List;

/**
 * @program: design-patterns
 * @ClassName StudentAggregateImpl
 * @description:
 * @author: 
 * @create: 2023-01-27 17:29
 * @Version 1.0
 **/
public class StudentAggregateImpl implements StudentAggregate {

    private List<Student> list = new ArrayList<>();

    public StudentAggregateImpl() {
    }

    public StudentAggregateImpl(List<Student> list) {
        this.list = list;
    }

    @Override
    public void addStudent(Student student) {
        list.add(student);
    }

    @Override
    public void removeStudent(Student student) {
        list.remove(student);
    }

    @Override
    public StudentIterator getStudentIterator() {
        return new StudentIteratorImpl(list);
    }
}
package com.itheima.pattern.iterator;

/**
 * @program: design-patterns
 * @ClassName StudentIterator
 * @description: 抽象迭代器角色接口
 * @author: 
 * @create: 2023-01-27 17:20
 * @Version 1.0
 **/
public interface StudentIterator {
    // 判断是否还有元素
    boolean hasNext();

    // 获取下一个元素
    Student next();
}
package com.itheima.pattern.iterator;

import java.util.ArrayList;
import java.util.List;

/**
 * @program: design-patterns
 * @ClassName StudentIteratorImpl
 * @description:
 * @author: 
 * @create: 2023-01-27 17:23
 * @Version 1.0
 **/
public class StudentIteratorImpl implements StudentIterator {

    private List<Student> studentList;
    private int position = 0;// 用来记录遍历时的位置

    public StudentIteratorImpl(List<Student> studentList) {
        this.studentList = studentList;
    }

    @Override
    public boolean hasNext() {
        return position < studentList.size();
    }

    @Override
    public Student next() {
        // 从集合中获取指定位置的元素
        Student student = studentList.get(position);
        position++;
        return student;
    }
}

3.优缺点

  • 优点
    • 它支持以不同的方式遍历一个聚合对象,在同一个聚合对象上可以定义多种遍历方式。在迭代器模式中只需要用一个不同的迭代器来替换原有迭代器即可改变遍历算法,我们也可以自己定义迭代器的子类以支持新的遍历方式。
    • 迭代器简化了聚合类。由于引入了迭代器,在原有的聚合对象中不需要再自行提供数据遍历等方法,这样可以简化聚合类的设计。
    • 在迭代器模式中,由于引入了抽象层,增加新的聚合类和迭代器类都很方便,无须修改原有代码,满足 “开闭原则” 的要求。
  • 缺点
    • 增加了类的个数,这在一定程度上增加了系统的复杂性。

4.使用场景

  • 当需要为聚合对象提供多种遍历方式时。
  • 当需要为遍历不同的聚合结构提供一个统一的接口时。
  • 当访问一个聚合对象的内容而无须暴露其内部细节的表示时。

5.JDK源码解析

迭代器模式在JAVA的很多集合类中被广泛应用,接下来看看JAVA源码中是如何使用迭代器模式的。

List<String> list = new ArrayList<>();
Iterator<String> iterator = list.iterator(); //list.iterator()方法返回的肯定是
Iterator接口的子实现类对象
while (iterator.hasNext()) {
	System.out.println(iterator.next());
}

看完这段代码是不是很熟悉,与我们上面代码基本类似。单列集合都使用到了迭代器,我们以ArrayList举例来说明

  • List:抽象聚合类
  • ArrayList:具体的聚合类
  • Iterator:抽象迭代器
  • list.iterator():返回的是实现了 Iterator 接口的具体迭代器对象

具体的来看看 ArrayList的代码实现

public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable {
public Iterator<E> iterator() {
return new Itr();
}
private class Itr implements Iterator<E> {
int cursor; // 下一个要返回元素的索引
int lastRet = -1; // 上一个返回元素的索引
int expectedModCount = modCount;
Itr() {}
//判断是否还有元素
public boolean hasNext() {
return cursor != size;
}
//获取下一个元素
public E next() {
checkForComodification();
int i = cursor;
if (i >= size)
throw new NoSuchElementException();
Object[] elementData = ArrayList.this.elementData;
if (i >= elementData.length)
throw new ConcurrentModificationException();
cursor = i + 1;
return (E) elementData[lastRet = i];
}
...
}

这部分代码还是比较简单,大致就是在 iterator 方法中返回了一个实例化的 Iterator 对象。Itr是一个内部类,它实现了 Iterator 接口并重写了其中的抽象方法。

注意:当我们在使用JAVA开发的时候,想使用迭代器模式的话,只要让我们自己定义的容器类实现java.util.Iterable 并实现其中的iterator()方法使其返回一个 java.util.Iterator 的实现类就可以了。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

实战案例:Python批量识别银行卡号码并且写入Excel,初学者也可以轻松使用~

大家好&#xff0c;这里是程序员晚枫&#xff0c; 今天我们继续学习Python自动化办公&#xff1a;每次有新员工入职&#xff0c;都要收集大量的工资卡信息&#xff0c;并且生成Excel文档&#xff0c;能不能用Python准确、快速地解决呢&#xff1f; 今天我们就来学习一下&…

【CCNA | 网络模拟器CPT系列】Cisco Packet Tracer 8.2.0 的安装 Ⅰ

目录1. 下载 Cisco Packet Tracer2. 安装 Cisco Packet Tracer&#xff08;1&#xff09;许可协议界面&#xff08;2&#xff09;选择安装目录&#xff08;3&#xff09;选择开始菜单文件夹&#xff08;4&#xff09;选择附加任务&#xff08;5&#xff09;确认设置选择&#x…

K8S环境安装

K8S环境安装 下面是环境的主机名和IP 主机名ipk8smaster192.168.68.150k8snode1192.168.68.151k8snode2192.168.68.152 1、安装docker 配置yum源 sudo yum install -y yum-utils sudo yum-config-manager \ --add-repo \ http://mirrors.aliyun.com/docker-ce/linux/centos/d…

不受支持的 Mac 上的通用控制(现已支持 macOS Ventura)

现已支持 macOS Ventura 请访问原文链接&#xff1a;不受支持的 Mac 上的通用控制&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;www.sysin.org 本文为 在不受支持的 Mac 上安装 macOS Ventura、Monterey、Big Sur (OpenCore Legacy Pa…

【Effective_Objective-C_5内存管理】

文章目录前言29.理解引用计数引用计数的工作原理关闭ARC模式引用计数的增减理解一下引用计数存在属性存取方法中的内存管理自动释放池保留环要点30.以ARC简化引用计数使用ARC时必须遵循的方法和命名规则-变量的内存管理语法意义ARC如何清理实例变量覆写内存管理的方法要点31.在…

eclipse调试没反应,没有Debug窗口弹出

用eclipse调试&#xff0c;点击“Run”“Debug as”没有反应&#xff0c;debug视图没有弹出一、打开Preferences点击“Windows”&#xff0c;点击“Preferences”&#xff0c;找到“Run/Debug”下面的“Perspectives”&#xff0c;我的打开是这个样子&#xff0c;要修改一些选项…

【JavaSE成神之路】一文搞定static关键字

哈喽&#xff0c;我是兔哥呀&#xff0c;今天就让我们继续这个JavaSE成神之路&#xff01; 这一节啊&#xff0c;咱们要学习的内容是Java的static关键字。 1. 我们是怎么使用static关键字的 我们其实一直在用static关键字&#xff0c;比如main方法&#xff1a; public stati…

CSS样式基础内容3

目录 CSS三大特性 层叠性 继承性 行高的继承性 优先级 权重的叠加 CSS盒子模型 border边框 边框的复合写法 表格的细线边框 边框会影响盒子的实际大小 内边距 padding会影响盒子实际大小 网页导航案例 外边距 外边距合并 相邻块元素垂直外边距的合并 清除内外…

go语言实战(猜数字+在线词典+服务器)

go语言实战案例1.猜数字游戏2. 词典2.1 request2.2 response2.3 修改写死的单词为用户可写的word2.4 细节优化2.4.1 防止403、404等状态码2.4.2 增强输出可读性2.5 在线词典的最终代码3.SOCKS5代理服务器3.1 tcp echo server3.2 验证3.3 请求3.4 完整代理实现作业1.修改第一个猜…

cadence SPB17.4 S032 - allegro出的槽孔文件不用做任何处理就可以交给板厂生产

文章目录cadence SPB17.4 S032 - allegro出的槽孔文件不用做任何处理就可以交给板厂生产前言备注补充 - CAM350V14.6 - 在win10 22H2下不能正常用ENDcadence SPB17.4 S032 - allegro出的槽孔文件不用做任何处理就可以交给板厂生产 前言 以前交给板厂gerber文件时, 有一次, 板…

Pandas学习笔记-Day1安装与文件读取

Day1 安装与文件读取了解与安装什么是pandas?安装pandas?pandas数据读取读取mysql数据库了解与安装 什么是pandas? 处理数据一般分为几个阶段&#xff1a;数据整理与清洗、数据分析与建模、数据可视化与制表&#xff0c;Pandas 是处理数据的理想工具。 安装pandas? 如果…

自动驾驶感知——图像数据处理数学方法

文章目录1. 二值化操作2. 卷积操作3. 均值滤波4. 高斯滤波5. 图像梯度算子5.1 Prewitt梯度算子5.2 Sobel梯度算子5.3 Laplace二阶梯度6. 边缘特征点提取算子7. 基于规则的特征点提取8. 最小二乘拟合方法9. RANSAC曲线拟合10. Hough Transform 霍夫变换11. 基于学习的特征点提取…

图论(4)Floyd算法

一、概述 floyd算法主要作用有&#xff1a;1.找最短路 2.求传递闭包 3.找最小环 4.求出恰好经过k条边的最短路 本文章将介绍floyd求最短路的证明以及以上四个作用的实践。 二、floyd算法求最短路的证明 之前就多次提到过图论与dp问题的联系&#xff0c;floyd算法可以…

Go依赖管理

"做讨厌潮汐的稚童&#xff0c;祈祷月球失踪。"一、背景我们写一个程序&#xff0c;例如输出hello world 或者 一个猜数字游戏&#xff0c;这些用到的单体函数接口&#xff0c;只需要依赖一些原生的SDK即可。但是&#xff0c;面对复杂的实际问题、工程&#xff0c;仅…

使用构建工具创建Vue项目

使用构建工具创建Vue项目一、使用vue-cli脚手架构建vue项目创建步骤&#xff1a;二、使用 Vite构建vue项目创建步骤&#xff1a;一、使用vue-cli脚手架构建vue项目 Vue CLI 是一个基于 Vue.js 进行快速开发的完整系统&#xff0c;提供&#xff1a; 1 通过 vue/cli 实现的交互式…

演讲比赛流程管理系统

1. 演讲比赛程序需求 1.2程序功能 2. 项目创建 创建名为speech_contest的目录名称 3. 创建管理类 功能描述&#xff1a; 提供菜单界面与用户交互 对演讲比赛流程进行控制 与文件的读写交互 3.1 创建文件 在头文件和源文件的文件夹下分别创建speech…

ubuntu 学习笔记

环境&#xff1a;Ubuntu 22.04 桌面版和server版 一、更换国内源&#xff0c;下载更快 1、源文件路径&#xff1a;/etc/apt/sources.list&#xff0c;到这个路径下备份一下源文件。 #备份原有配置文件命令 sudo cp -r /etc/apt/sources.list /etc/apt/sources.list.backup …

C primer plus学习笔记 —— 14、限定关键字(const、volatile、restrict、_Atomic)

文章目录const 关键字修饰变量修饰指针修饰形参修饰全局变量volatile关键字restrict关键字_Atomic关键字&#xff08;c11&#xff09;const 关键字 修饰变量 将变量变为只读 const int nochange; nochange 4; //不允许 const int a 5; //没问题const int a[3] {3, 5, 6};…

Hive--14---使用sum() over() 实现累积求和

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录Hive中使用over()实现累积求和1.总求和sum(需要求和的列) over(partition by 分组列 )数据准备需求1以地区号网点号币种 为唯一键&#xff0c;求总的金额需求2以地区…

python图像处理(高斯滤波)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 在谈高斯滤波之前,我们不妨回顾一下之前谈到的均值滤波和中值滤波。均值滤波,就是对像素点以及周围的8个点计算平均值,然后赋值给新像素点。而中值滤波,则是对像素点及周围的8个…