设计模式之迭代器模式

设计模式系列(十三)迭代器模式(Iterator Pattern) 设计模式系列(十三)迭代器模式(Iterator Pattern)     迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而不暴露器内部的表示。也就是说,迭代器模式让我们能游走于聚合内的每一个元素,而又不暴露其内部的表示,把游走的任务放在迭代器上,而不是聚合上,这样就简化了聚合的接口和实现,也让责任各得其所。     学过面向对象编程语言的朋友一定对迭代器这个设计深有 阅读详情

什么是迭代器模式

    迭代器模式是提供一种方法来访问聚合对象,而不用暴露这个对象的内部结构。
    迭代器模式主要包含以下几个角色:
        Iterator(抽象迭代器):定义了访问和遍历元素的接口,声明了用于遍历数据元素的方法。
        ConcreteIterator(具体迭代器):实现了抽象迭代器接口,完成对聚合对象的遍历,同时在具体迭代器中通过下标来记录在聚合对象中所处的当前位置。
        Aggregate(抽象聚合类):用于存储和管理元素对象。
        ConcreteAggregate(具体聚合类):实现了抽象聚合类中的方法。

迭代器模式的优缺点

优点
  1. 支持以不同的方式遍历一个聚合对象,在一个聚合对象中可以定义多种遍历方式。
  2. 迭代器简化了聚合类。
  3. 增加新的聚合类和迭代器类方便,符合开闭原则。
缺点
  1. 将存储数据和遍历数据分离,增加新的聚合类需要对应增加迭代器类,类的个数成对增加,在一定程度上增加了系统的复杂性。
  2. 抽象迭代器的设计难度较大,需要充分考虑系统将来的发展。

迭代器模式的应用场景

  1. 访问一个聚合对象的内容而无需暴露内部表示。
  2. 需要为一个聚合对象提供多种遍历方式。
  3. 为遍历不同的聚合结构提供一个统一的接口,在该接口的实现类中为不同的聚合结构提供不同的遍历方式。

迭代器模式的案例

// 抽象聚合类
public interface College {
    String getName();

    /**
     * 增加系的方法
     *
     * @param name name
     * @param desc desc
     */
    void addDepartment(String name, String desc);

    /**
     * 返回一个迭代器,遍历
     *
     * @return Iterator
     */
    Iterator createIterator();
}


@Data
public class Department {

    private String name;
    private String desc;

    public Department(String name, String desc) {
        super();
        this.name = name;
        this.desc = desc;
    }

}

// 具体聚合类
public class ComputerCollege implements College {

    Department[] departments;

    /**
     * 保存当前数组的对象个数
     */
    int numOfDepartment = 0;


    public ComputerCollege() {
        departments = new Department[5];
        addDepartment("Java专业", " Java专业 ");
        addDepartment("PHP专业", " PHP专业 ");
        addDepartment("大数据专业", " 大数据专业 ");
    }

    @Override
    public String getName() {
        return "计算机学院";
    }

    @Override
    public void addDepartment(String name, String desc) {
        Department department = new Department(name, desc);
        departments[numOfDepartment] = department;
        numOfDepartment += 1;
    }

    @Override
    public Iterator createIterator() {
        return new ComputerCollegeIterator(departments);
    }

}

// 具体迭代器类
public class ComputerCollegeIterator implements Iterator {

    Department[] departments;

    int position = 0;


    public ComputerCollegeIterator(Department[] departments) {
        this.departments = departments;
    }

    @Override
    public boolean hasNext() {
        return position < departments.length && departments[position] != null;
    }

    @Override
    public Object next() {
        Department department = departments[position];
        position += 1;
        return department;
    }

    @Override
    public void remove() {

    }

}

public class OutPutImpl {

    List<College> collegeList;

    public OutPutImpl(List<College> collegeList) {

        this.collegeList = collegeList;
    }

    public void printCollege() {
        //从collegeList 取出所有学院, Java 中的 List 已经实现Iterator

        for (College college : collegeList) {
            //取出一个学院
            System.out.println("=== " + college.getName() + "=====");
            printDepartment(college.createIterator());
        }
    }

    public void printDepartment(Iterator iterator) {
        while (iterator.hasNext()) {
            Department d = (Department) iterator.next();
            System.out.println(d.getName());
        }
    }

}

public static void main(String[] args) {
    List<College> collegeList = new ArrayList<>();

    ComputerCollege computerCollege = new ComputerCollege();
    collegeList.add(computerCollege);

    OutPutImpl outPutImpl = new OutPutImpl(collegeList);
    outPutImpl.printCollege();
}

![在这里插入图片描述](https://img-blog.csdnimg.cn/0183ff5c66b647e7864fb38621a9fb74.png#pic_center)

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

ArrayList
public interface List<E> extends Collection<E> {

    Iterator<E> iterator();
    boolean add(E e);
    boolean remove(Object o);

}

public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{

    ......
    
    public Iterator<E> iterator() {
        return new Itr();
    }

    /**
     * An optimized version of AbstractList.Itr
     */
    private class Itr implements Iterator<E> {
        int cursor;       // index of next element to return
        int lastRet = -1; // index of last element returned; -1 if no such
        int expectedModCount = modCount;

        Itr() {}

        public boolean hasNext() {
            return cursor != size;
        }

        @SuppressWarnings("unchecked")
        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];
        }

        public void remove() {
            if (lastRet < 0)
                throw new IllegalStateException();
            checkForComodification();

            try {
                ArrayList.this.remove(lastRet);
                cursor = lastRet;
                lastRet = -1;
                expectedModCount = modCount;
            } catch (IndexOutOfBoundsException ex) {
                throw new ConcurrentModificationException();
            }
        }

        @Override
        @SuppressWarnings("unchecked")
        public void forEachRemaining(Consumer<? super E> consumer) {
            Objects.requireNonNull(consumer);
            final int size = ArrayList.this.size;
            int i = cursor;
            if (i >= size) {
                return;
            }
            final Object[] elementData = ArrayList.this.elementData;
            if (i >= elementData.length) {
                throw new ConcurrentModificationException();
            }
            while (i != size && modCount == expectedModCount) {
                consumer.accept((E) elementData[i++]);
            }
            // update once at end of iteration to reduce heap write traffic
            cursor = i;
            lastRet = i - 1;
            checkForComodification();
        }

        final void checkForComodification() {
            if (modCount != expectedModCount)
                throw new ConcurrentModificationException();
        }
    }

    
}

【Java设计模式】Java设计模式之(八)迭代器模式(Iterator Pattern) 本文目录 一、迭代器概述 1.1 优缺点 1.2 使用场景 1.3 注意事项 二、代码实现 2.1 通用类图 2.2 代码实现 迭代器模式(Iterator Pattern)是 Java 和 .Net 编程环境中非常常用的设计模式。迭代器模式属于行为型模式。这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。 一、迭代器概述 意图:提供一种方法顺序访问一个聚合对象中各个元素, 而又无须暴露该对象的内部表示。 主要解决:不同的方式来遍历整个整合对象。 何时使用:遍历一个聚 阅读详情

相关推荐

FastDDS之共享内存

transport层负责为DDS用户数据收发和服务发现提供通信。包含UDP,TCP,SHM。

u010378559的博客 3085

您的设计模式——迭代器模式【Iterator Pattern】

周五下午,我正在看技术网站,第六感官发觉有人在身后,扭头一看,我 C,老大站在背后,赶忙站起来, “王经理,你找我?” 我说。“哦,在看技术呀。有个事情找你谈一下,你到我办公室来一下。” 老大说。 到老大办公室,“是这样,刚刚我在看季报,我们每个项目的支出费用都很高,项目情况复杂,人员情况也不简单,我看着也有点糊涂,你看,这是我们现在还在开发或者维护的 103 个项目,你能不能先把这些项目信息重

557

DC-DC BUCK电路 PCB 布局布线 5 要点:以 XL4015 12V转5V 为例解析噪声控制

本文以XL4015 12V转5V降压电路为例,详细解析DC-DC BUCK电路PCB布局布线的5个关键要点,重点探讨噪声控制策略。通过功率回路最小化、热管理与接地优化、电感电容布局、反馈网络防干扰设计以及实测验证技巧,帮助工程师实现高效稳定的电源设计,显著降低输出纹波和电磁干扰。

weixin_29165725的博客 369

设计模式迭代器模式(IteratorPattern)

核心模块:迭代器角色(定义访问和遍历元素的接口),具体迭代器角色,容器角色,具体容器角色 所有代码请访问:git@code.aliyun.com:289804201/PatternLearn.git 使用场景:外部对象访问内部聚合对象; 优点:将存储数据和遍历数据分开,符合单一职责原则; 缺点:新聚合类,就要增加新的迭代器类;增加系统复杂性; /** * C

didiao11300的专栏 723

RACECAR底层平台安装:Jetson Nano+ROS Melodic全栈部署指南

移动机器人开发中,底层平台安装是将硬件转化为可编程移动平台的关键起点。其核心在于嵌入式系统、ROS中间件与传感器驱动的深度协同——需兼顾内核模块加载、GPIO/PWM精确控制、I2C设备初始化及ROS工作空间构建等多层技术耦合。尤其在竞速级小车如RACECAR场景下,Jetson Nano的硬件加速能力、MPU6050 IMU固件加载、TB6612FNG电机驱动配置等细节,直接决定运动控制精度与实时性。本文聚焦Ubuntu 18.04 + ROS Melodic + JetPack 4.4.1技术栈,覆盖从

weixin_32025789的博客 255

【科学文献计量】标准参考出版年谱(Standard RPYS)和多维参考出版年谱(Multi RPYS)

@[TOC](标准参考出版年谱(Standard RPYS)和多维参考出版年谱(Multi RPYS)) 1 标准参考出版年谱与多维参考出版年谱 1.1 标准参考出版年谱(Standard RPYS) 标准参考出版年谱(Standard Reference Publication Year Spectroscopy)是由Marx, Bornmann, Barth, and Leydesdorff(2014)和Marx and Bornmann(2014)提出的一种量化历史出版物对研究领域影响的方法。该方法通

lys_828的博客 1103

23种设计模式之迭代器模式(Iterator Pattern)

本篇文章将23种设计模式中的迭代器模式,此篇文章为一天学习一个设计模式系列文章,后面会分享其他模式知识。

小威的博客 2万+

用 SELECT FOR UPDATE 亲手制造典型数据库死锁——从 ABAP 视角揭秘 RDBMS 的锁争夺战

在日常 ABAP 开发中,多数人只在 ST22 里偶尔瞥见这行 dump,却对背后的原理知之甚少。本文借助社区前辈的经典实验,还原一个可复现的死锁现场,进一步讨论产生根因、检测手段与规避策略,并用真实业务案例串联起数据库、Open SQL 与 SAP NetWeaver 锁管理之间的逻辑链条。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 454

设计模式(Design pattern)之迭代器模式(Iterator Pattern)

本文介绍了Java中的迭代器设计模式实现。迭代器模式提供了一种顺序访问聚合对象元素的方法,同时隐藏其内部结构。文章展示了完整的代码示例,包括抽象迭代器接口(MachineIterator)、聚合角色接口(MachineGather)及其实现类(MachineGatherImpl)。具体实现中,Machine类表示设备对象,MachineImpl类实现了迭代器逻辑,通过hasNext()和next()方法遍历集合。最后通过CustomerRun类的main方法演示了如何使用迭代器遍历设备集合。该模式属于行为型

RR1335 之代码才是动力源 260

1篇1章3节:R 语言的产生与发展轨迹(更新2024/08/14)

药物的研究阶段包括靶标确定、生物学模型建立、新化学实体的发现和优化新化学实体四个关键环节。每个环节都在药物研发过程中发挥着至关重要的作用。通过科学严谨的方法和技术手段,研究人员能够在药物研发过程中不断探索和优化,从而发现和开发出具有高效、安全性的候选药物,为疾病治疗提供更多的选择和希望。

MD Code 2661

60、拓扑码:从理论到应用

本博客深入探讨了拓扑码的基本理论、构造方法及其在量子计算中的应用。重点介绍了颜色码的拓扑起源、编码量子比特的计算方法、弦算子的构造与性质、边界条件的影响、同调描述以及与统计模型相关的错误阈值分析。同时,还涵盖了拓扑码的历史发展、与其他拓扑码的关系、与凝聚态系统的联系,以及其在激发态和高维中的表现。博客展示了拓扑码在容错量子计算和未来量子信息领域的广阔前景。

o1p2q3r的博客 129

【设计模式】GoF设计模式之迭代器模式(Iterator Pattern)

迭代器模式是一种行为型设计模式,其核心思想是由业务类生成一个迭代器,通过迭代器可以以某种逻辑遍历,访问业务类实例中特定集合中的元素。 业务类实例中的集合可以有不同的遍历逻辑,对于不同的遍历逻辑,可以生成不同的迭代器。

YoseZang的博客 809

【VibeCoding系列】小白入门指南:模型选择、编辑器选择、项目预定全分析

开箱即用:下载安装就能用,不用配 API Key(也可以自己配)Cmd+K 快速修改:选中代码,按 Cmd+K,直接让 AI 修改Cmd+L 对话:侧边栏聊天,支持引用文件和代码@文件引用:输入 @ 就能引用项目中的文件,AI 自动读取上下文Agent 模式:告诉 AI 一个需求,它自动跨文件修改下载地址cursor.com(免费版有额度限制,足够入门)✅下载 Cursorcursor.com),安装打开✅选一个小项目(个人名片页 or Todo List)✅按照七步工作流开干。

十年老程序猿,AI 疯狂研究专家,前沿硬核知识分享 210

设计模式-迭代器模式(Iterator Pattern)

迭代器模式 定义 提供一种方法来访问聚合对象,而不用暴露这个对象的内部表示,其别名为游标(Cursor)。 类型 行为型。 角色 抽象迭代器(Iterator):抽象迭代器负责定义访问和遍历元素的接口。 具体迭代器(ConcreteIterator):提供具体的元素遍历行为。 抽象容器(Aggregate):负责定义提供具体迭代器的接口。 具体容器(ConcreteAggregate):创建具体...

kaven 1643

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

【设计模式】——迭代器模式(Iterator Pattern)

迭代器模式(Iterator Pattern)是一种行为设计模式,它为访问一个聚合对象(如列表、集合等)中的元素提供了一种统一的方法,同时又不暴露其内部表示。通过迭代器模式,算法与聚合对象的结构相分离,增加了代码的灵活性和可重用性。

J^T的博客 1162

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

设计模式:迭代器模式(Iterator Pattern)

迭代器模式是一种行为设计模式, 让你能在不暴露集合底层表现形式 (列表、 栈和树等) 的情况下遍历集合中所有的元素。

TechNomad的博客 837

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Java设计模式——迭代器模式【Iterator Pattern】

Java设计模式、迭代器模式、Iterator Pattern

scorpio的博客 503

设计模式之 迭代器模式(Iterator Pattern) Java实现

  所谓迭代器模式,就是把集合的数据和遍历分开 让遍历集合依赖于迭代器,而不依赖于具体的集合 从而可以达到代码复用 java中的增强for循环就是迭代器模式的应用,要使用增强for循环语法的集合,就要实现java.util.Iterator接口。 在迭代器模式中,需要几个角色 Iterator(迭代器) ConcreteIterator(具体的迭代器) Aggregate(集合) ...

Lu_1u的博客 546

23种设计模式——迭代器模式 (Iterator Pattern)详解

本文介绍了23种设计模式之——迭代器模式 (Iterator Pattern)的说明及使用

Meteors.的博客 980

设计模式-迭代器模式-Iterator Pattern

是一种提供共享所有权(shared ownership)的互斥量,它允许多个线程同时获取共享锁(shared lock),进行读操作,或者独占锁(unique lock),进行写操作。迭代器模式(Iterator Pattern)是一种常用的设计模式,它在软件开发中用于顺序访问一个聚合对象中的各个元素,而不需要暴露其内部的表现。迭代器模式的应用场景非常广泛,它的核心价值在于提供了一种抽象和解耦的方式,使得客户端代码可以独立于数据结构的具体实现,从而提高了代码的灵活性和可维护性。

wesigj的博客 1897

设计模式之迭代器模式详解(Iterator Pattern)

认识迭代器模式 在系统开发中,集合对象内部表示各不相同。底层构造也尽不相同。对于这些对象,我们希望在不暴露其底层和内部表示的同时,可以使外部客户访问其中元素。 迭代器模式就为这一需求提供了极其优雅的实现,接下来就让我们来认识认识迭代器模式: 迭代器模式,提供一种遍历集合元素的统一接口,用一致的方法遍历集合元素,不需要知道集合对象的底层表示,即:不暴露其内部的结构。 迭代器模式(Iterato...

Superman_peng的博客 537

设计模式 18 迭代器模式 Iterator Pattern

迭代器模式 (Iterator Pattern) 是一种行为型设计模式,它提供了一种访问集合元素的标准方法,而无需暴露集合的内部表示。提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。核心思想来自将遍历集合的逻辑从集合本身中分离出来,封装到一个独立的迭代器对象中。迭代器对象负责维护遍历的当前位置,并提供访问下一个元素的方法。想象一个书架,上面摆满了书籍。直接访问: 你直接走到书架前,从最左边开始一本一本地拿书阅读。

jxusthusiwen的专栏 1609

设计模式——迭代器模式(Iterator Pattern)+ Spring相关源码

用于顺序访问集合对象的元素,使用者不需要知道集合对象的底层表示。

码鹿的记录 1099

设计模式21:Iterator Pattern (迭代器模式)

可以查看英文原文:http://www.dofactory.com/Patterns/PatternIterator.aspx一、迭代器模式:Iterator PatternDefine:Provide a way to access the elements of an aggregate object sequentially without exposing its underlyi

薛敬明的专栏 1518

设计模式教程:迭代器模式(Iterator Pattern)

提供一种方法顺序访问一个集合对象中的各个元素,而又不暴露该对象的内部表示。

遇见伯灵说的博客 1042
上一篇: 设计模式之解释器模式
下一篇: 设计模式之中介者模式
geek-wmy
博客等级 码龄9年 322粉丝 126原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值