迭代器设计模式(Iterator Design Pattern)[论点:概念、组成角色、相关图示、示例代码、框架中的运用、适用场景]

news2025/1/20 10:49:12

概念

        迭代器设计模式(Iterator Design Pattern)是一种行为型设计模式,它提供了一种方法来顺序访问一个聚合对象(如集合)的元素,而不需要暴露该对象的底层表示。迭代器模式可以帮助我们在不关心底层数据结构的情况下,遍历一个集合。

组成角色

  1. 抽象迭代器(Iterator):定义遍历元素所需的接口,通常包括 hasNext() 和 next() 方法。
  2. 具体迭代器(Concrete Iterator):实现抽象迭代器接口,完成对聚合对象的遍历。
  3. 抽象聚合(Aggregate):定义创建迭代器对象的接口,通常包括一个创建迭代器的方法。
  4. 具体聚合(Concrete Aggregate):实现抽象聚合接口,实例化具体迭代器。

相关图示

在这里插入图片描述

示例代码

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

// 抽象迭代器接口
interface Iterator {
    boolean hasNext();
    Object next();
}

// 具体迭代器
class ConcreteIterator implements Iterator {
    private List<Object> list;
    private int position = 0;

    public ConcreteIterator(List<Object> list) {
        this.list = list;
    }

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

    @Override
    public Object next() {
        return list.get(position++);
    }
}

// 逆序具体迭代器
class ReverseConcreteIterator implements Iterator {
    private List<Object> list;
    private int position;

    public ReverseConcreteIterator(List<Object> list) {
        this.list = list;
        position = list.size() - 1;
    }

    @Override
    public boolean hasNext() {
        return position >= 0;
    }

    @Override
    public Object next() {
        return list.get(position--);
    }
}

// 抽象聚合接口
interface Aggregate {
    Iterator createIterator(boolean reverse);
}

// 具体聚合
class ConcreteAggregate implements Aggregate {
    private List<Object> list = new ArrayList<>();

    public void addItem(Object item) {
        list.add(item);
    }

    @Override
    public Iterator createIterator(boolean reverse) {
        return reverse ? new ReverseConcreteIterator(list) : new ConcreteIterator(list);
    }
}

// 客户端代码
public class IteratorDemo {
    public static void main(String[] args) {
        ConcreteAggregate aggregate = new ConcreteAggregate();
        aggregate.addItem("Item 1");
        aggregate.addItem("Item 2");
        aggregate.addItem("Item 3");
				
      	//顺序输出
        Iterator iterator = aggregate.createIterator(false);
        System.out.println("Normal order:");
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }

      	//逆序输出
        Iterator reverseIterator = aggregate.createIterator(true);
        System.out.println("\nReverse order:");
        while (reverseIterator.hasNext()) {
            System.out.println(reverseIterator.next());
        }
    }
}

框架中的运用

        迭代器设计模式被广泛用于集合框架。集合框架包括一系列用于处理一组对象的接口和类,例如 List、Set 和 Map。迭代器设计模式使得遍历和操作这些集合变得简单和一致。

        Java 集合框架中的迭代器设计模式主要涉及两个接口:java.util.Iteratorjava.lang.Iterable

  1. java.util.Iterator:这是一个迭代器接口,定义了用于遍历集合元素的方法。主要方法有:
    • boolean hasNext():如果仍有元素可以迭代,则返回 true。
    • E next():返回迭代的下一个元素。
    • void remove():从底层集合中移除迭代器返回的最后一个元素(可选操作)。
  2. java.lang.Iterable:这是一个表示可迭代对象的接口,通常由集合类实现。主要方法有:
    • Iterator<E> iterator():返回一个迭代器,用于遍历集合元素。

        ArrayList 是一个实现了 java.util.List 接口的可调整大小的数组。List 接口扩展了 java.util.Collection,而 Collection 接口扩展了 java.lang.Iterable。因此,ArrayList 类需要实现 Iterable 接口中的 iterator() 方法。

public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable {
    // ...
    
    // 实现 Iterable 接口中的 iterator() 方法
    public Iterator<E> iterator() {
        return new Itr();
    }
    
    // 内部类 Itr 实现了 Iterator 接口
    private class Itr implements Iterator<E> {
        int cursor;       // 下一个元素的索引
        int lastRet = -1; // 上一个元素的索引
        
        // 实现 Iterator 接口中的 hasNext() 方法
        public boolean hasNext() {
            return cursor != size;
        }
        
        // 实现 Iterator 接口中的 next() 方法
        @SuppressWarnings("unchecked")
        public E next() {
            // ...
            Object[] elementData = ArrayList.this.elementData;
            int i = cursor;
            cursor = i + 1;
            return (E) elementData[lastRet = i];
        }
        
        // 实现 Iterator 接口中的 remove() 方法
        public void remove() {
            if (lastRet < 0)
                throw new IllegalStateException();
            // ...
            ArrayList.this.remove(lastRet);
            cursor = lastRet;
            lastRet = -1;
        }
    }
}

适用场景

  1. 不同的数据结构:当需要访问和遍历不同类型的数据结构(如数组、链表、树或图等)时,迭代器设计模式提供了一种统一的接口,使客户端代码能够以相同的方式处理这些不同的数据结构。
  2. 抽象数据访问:当需要对集合或容器中的元素进行访问,而不需要关心集合的具体实现细节时,迭代器设计模式可以提供一个抽象的访问接口,使得客户端代码可以处理元素而不依赖于容器的内部结构。
  3. 容器内部结构的封装:迭代器设计模式可以将容器的内部结构封装起来,使得容器的实现可以在不影响客户端代码的情况下进行修改。
  4. 支持多种遍历方式:当需要为集合提供多种遍历方式(例如正序遍历、逆序遍历、层次遍历等)时,可以为每种遍历方式实现一个具体的迭代器,这使得客户端代码可以方便地切换不同的遍历方式。

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

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

相关文章

红酒分类案例中使用分箱处理

红酒分类案例中使用分箱处理 描述 在建立分类模型时&#xff0c;通常需要对连续特征进行离散化(Discretization)处理 &#xff0c;特征离散化后&#xff0c;模型更加稳定&#xff0c;降低了过拟合风险。离散化也叫分箱(binning)&#xff0c;是指把连续的特征值划分为离散的特…

Binder Driver 初探从驱动层角度来看

1&#xff1a;驱动概述 1.1基本简介 Binder 驱动是 Android 专用的&#xff0c;但底层的驱动架构与Linux 驱动一样。binder 驱动在以 misc 设备进行注册&#xff0c;作为虚拟字符设备&#xff0c;没有直接操作硬件&#xff0c;只是对设备内存的处理。主要是驱动设备的初始化(b…

如何刻录光盘文件

常识补充刻录机简介光盘刻录机是一种数据写入设备&#xff0c;利用激光将数据写到空光盘上从而实现数据的储存。其写入过程可以看做普通光驱读取光盘的逆过程。基本原理刻入数据时&#xff0c;利用高功率的激光束反射到盘片&#xff0c;使盘片上发生变化&#xff0c;模拟出二进…

计算机网络常见协议

文章目录 计算机网络TCP/IP协议TCP协议的三次握手和四次挥手TCP连接建立过程TCP连接断开过程为什么要三次握手&#xff1f;为什么要四次挥手&#xff1f; UDP协议HTTP协议 计算机网络 学习计算机网络&#xff0c;来记录一下。 TCP/IP协议 TCP/IP协议是Internet最基本的协议、…

报错-crontab -e 定时任务执行失败排查

使用 crontab -e 定时启动 jar 包服务失败&#xff0c;排查过程如下&#xff1a; 1、查看 crontab 服务 crontab -l陈列出了待执行任务列表&#xff0c;crontab 正常。 2、检查脚本 单独执行脚本没有问题&#xff0c;脚本内容为检查线程&#xff0c;杀死线程&#xff0c;重…

Python每日一练(20230419)

目录 1. N皇后 II &#x1f31f;&#x1f31f;&#x1f31f; 2. 迷宫问题(递归) &#x1f31f;&#x1f31f;&#x1f31f; 3. 体操比赛成绩统计 ※ &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每…

分布式ID的生成方法

问题的提出 如今随着互联网的发展&#xff0c;数据的量级也是呈指数的增长&#xff0c;从GB到TB到PB.对数据的各种操作也是愈 加的困难&#xff0c;如何解决这个问题呢?此时就需要做数据库集群&#xff0c;为了提高查询性能将一一个数据库的数据分散 到不同的数据库中存储&am…

JVM垃圾回收与调优

文章目录 1、如何判断对象可以回收1.1、 引用计数法1.2、可达性分析法1.3、五种引用类型1.3.1 、强引用1.3.2 、软、弱引用1.3.3 、虚引用、终结器引用1.3.4、 终结器引用1.3.5 、总结 2. 垃圾清除算法2.1、标记清除2.2 、标记整理2.3、 复制 3. 分代垃圾回收3.1 、新生代、老年…

Excel技能之时间,士别三日让boss刮目相看

爱因斯坦说&#xff1a;“复利是世界第八大奇迹。”复利离不开时间&#xff0c;你也离不开时间。时间是如此重要&#xff0c;对每个人都是公平的。 曾经的你&#xff0c;看日历&#xff0c;数手指才能算清楚日期&#xff0c;不懂时间函数&#xff0c;太烦躁了。以下用真实的使…

哪种无线耳机音质最好?盘点2023四款好音质蓝牙耳机

随着蓝牙技术的发展&#xff0c;近几年人们对于蓝牙耳机的需求也在不断增加。但&#xff0c;蓝牙耳机自始至终都是用来听的&#xff0c;所以音质对于一款蓝牙耳机来说还是很重要的。下面&#xff0c;我来给大家推荐四款好音质蓝牙耳机&#xff0c;可以当个参考。 一、南卡小音舱…

沉岛思想(BFS)-朋友圈思想(并查集)

本篇博客旨在记录自已笔记&#xff0c;同时希望可给小伙伴一些帮助。本人也是算法小白&#xff0c;水平有限&#xff0c;如果文章中有什么错误之处&#xff0c;希望小伙伴们可以在评论区指出来&#xff0c;共勉 &#x1f4aa;。 沉岛思想&#xff1a; 题目&#xff1a; 给定一…

Sharding-JDBC之水平分库水平分表

目录 一、简介二、maven依赖三、数据库3.1、创建数据库3.2、创建表 四、配置&#xff08;二选一&#xff09;4.1、properties配置4.2、yml配置 五、实现5.1、实体5.2、持久层5.3、服务层5.4、测试类5.4.1、保存数据5.4.2、查询数据 一、简介 这里的水平分库分表是指 水平分库 …

台湾精锐APEX行星减速机直齿轮和斜齿轮有什么区别?如何选择?

台湾精锐APEX行星减速机是带太阳齿轮/行星齿轮/齿圈的机械装置。行星减速机是由太阳齿轮&#xff0c;行星齿轮的齿轮架和齿圈组成的机械装置。太阳齿轮位于中心&#xff0c;将扭矩传递到围绕太阳齿轮旋转的行星齿轮。行星齿轮和太阳齿轮位于齿圈内。 APEX减速机分为直齿轮和斜…

7.2 参数区间的估计

学习目标&#xff1a; 要学习参数的区间估计&#xff0c;我会采取以下步骤&#xff1a; 学习理论知识&#xff1a;首先&#xff0c;我会学习与参数的区间估计相关的理论知识&#xff0c;包括置信区间、抽样分布、中心极限定理、样本容量对置信区间的影响等。 掌握计算方法&am…

【小程序】小程序组件-2

目录 一. 滚轮选框 二. 音频组件 一. 滚轮选框 说真的&#xff0c;感谢微信开发者工具&#xff0c;让我这种笨比能够轻松学会这种看起来相当复杂的组件 picker组件的mode有几种模式&#xff0c;region啦&#xff0c;date啦&#xff0c;time啦&#xff0c;可以自行尝试 针对…

牛客社区项目

创建项目 认识Spring Spring Ioc Inversion 偶发Control 控制反转&#xff0c;是一种面向对象的设计思想。Dependecy Injection 依赖注入&#xff0c;是Ioc思想的实现方式。Ioc Container Ioc容器&#xff0c;是实现依赖注入的关键&#xff0c;本质上是一个工厂。 下面通过…

解决若依验证码异常:Error: image == null

前言 前两天在改项目突然发现若依的框架可以正常启动但是验证码加载不出来了&#xff0c;一直弹窗提示异常信息&#xff0c;下边是关于问题的描述和解决方案&#xff0c;没有耐心看过程的建议直接滑到最底下看解决方式 问题原因 登录页面一直提示 image null 如图 1 所示&…

最新研究!充分发挥混合量子经典算法新潜力

日本理化学研究所RIKEN的研究人员开发了一种量子计算算法&#xff0c;可高效准确地计算复杂材料中的原子级相互作用。物理学家理查德费曼于1981年首次提出量子计算机的应用&#xff0c;而该算法有可能为凝聚态物理学和量子化学带来前所未有的新局面。 量子计算机有望增强数字处…

数据格式转换(labelme、labelimg、yolo格式相互转换)

&#x1f468;‍&#x1f4bb;个人简介&#xff1a; 深度学习图像领域工作者 &#x1f389;总结链接&#xff1a; 链接中主要是个人工作的总结&#xff0c;每个链接都是一些常用demo&#xff0c;代码直接复制运行即可。包括&#xff1a; &am…

【鸿蒙应用ArkTS开发系列】- 常量类定义和使用

本篇为入门基础知识介绍&#xff0c;作为代码学习记录使用&#xff0c;请选择性阅读。 一、常量类定义 在ArkTS中&#xff0c;定一个常量很简单&#xff0c;具体如下&#xff1a; export const TAB_HOME_INDEX : number 1;export const TAB_HOME_NAME : string "首…