【设计模式-行为型】迭代器模式

ops/2025/2/4 8:48:08/

一、什么是迭代器模式

        迭代器模式,顾名思义,同样的为了让大家更加了解啥是迭代器。我们通过电影情结来说明,不知道大家有没有看过一个剧烧脑的科幻大片--《盗梦空间》。影片讲述了由造梦师(莱昂纳多·迪卡普里奥扮演的)带领特工团队进入他人梦境,从潜意识中盗取机密并重塑他人梦境的故事。其中个东西叫做造梦机,无论是谁(稍微不太准确),加以培训(使用造梦机)都可以进入多层梦境。这就是个典型的迭代器模式。盗梦空间中团队成员通过造梦机在不同的梦境层次之间穿梭,这种机制很好地体现了迭代器模式的核心思想。每次使用“造梦机”进入下一层梦境,都可以看作是对梦境层次集合的一次遍历操作。这种模式特别适用于需要遍历集合的场景。

        可以这么说,谁使用了 造梦机都会 进入迭代模式(梦境),并做一些处理,植入一些潜意识或者获得一些信息。

二、为什么使用迭代器模式

迭代器模式使得团队成员可以灵活地在不同的梦境层次之间穿梭,完成任务操作,而无需深入了解梦境层次的内部结构。

  1. 访问聚合对象的内容:当需要访问一个聚合对象的内容,而不需要暴露其内部的表示时,迭代器模式非常适用。团队成员通过造梦机访问梦境层次的内容,而无需了解梦境层次的具体实现细节。

  2. 支持多种遍历方式:当需要为聚合对象提供多种遍历方式时,迭代器模式可以提供统一的接口。团队成员可以通过造梦机选择不同的遍历方式,如正向遍历、反向遍历、跳跃遍历等,而不需要修改梦境层次结构的代码。

  3. 为遍历不同的聚合结构提供统一接口:当需要遍历不同类型的聚合结构时,迭代器模式可以提供统一的接口。团队成员可以使用统一的接口来遍历不同的梦境层次结构,而无需关心具体的结构实现。

三、迭代器模式示例

  1. 迭代器(Iterator 造梦机规范:通过造梦机,团队成员可以在不同的梦境层次之间穿梭。造梦机提供了遍历梦境层次的逻辑。

    public interface Iterator {boolean hasNext();Object next();
    }
  2. 具体迭代器(ConcreteIterator)

    具体的梦境穿梭机制:造梦机的具体实现,提供了进入下一层梦境(next())和检查是否还有下一层梦境(hasNext())的功能。public class DreamLevelIterator implements Iterator { private List<String> levels; private int index; public DreamLevelIterator(List<String> levels) { this.levels = levels; this.index = 0; } @Override public boolean hasNext() { return index < levels.size(); } @Override public Object next() { if (hasNext()) { return levels.get(index++); } return null; } }
  3. 聚合接口(Aggregate 梦境层次结构:定义了创建迭代器的方法,即如何通过造梦机进入梦境。

    public interface Aggregate {Iterator createIterator();
    }
  4. 具体聚合类(ConcreteAggregate 具体的梦境层次:实现了聚合接口,提供了梦境层次的集合,即团队成员可以进入的不同梦境。

    import java.util.ArrayList;
    import java.util.List;public class DreamLevels implements Aggregate {private List<String> levels = new ArrayList<>();public DreamLevels() {levels.add("第一层梦境");levels.add("第二层梦境");levels.add("第三层梦境");levels.add("第四层梦境");}@Overridepublic Iterator createIterator() {return new DreamLevelIterator(levels);}}

    通过这个代码示例,我们可以清晰地看到迭代器模式的核心优势。迭代器模式通过将集合的遍历逻辑从集合本身分离出来,提供了一种统一的方式访问不同类型的集合。这种模式特别适用于需要遍历集合的场景,使得客户端代码可以独立于集合的类型。


http://www.ppmy.cn/ops/155523.html

相关文章

重生之我在异世界学编程之C语言:深入指针篇(上)

大家好&#xff0c;这里是小编的博客频道 小编的博客&#xff1a;就爱学编程 很高兴在CSDN这个大家庭与大家相识&#xff0c;希望能在这里与大家共同进步&#xff0c;共同收获更好的自己&#xff01;&#xff01;&#xff01; 本文目录 引言正文&#xff08;1&#xff09;内置数…

Node.js 全局对象

Node.js 全局对象 引言 在Node.js中,全局对象是JavaScript环境中的一部分,它提供了对Node.js运行时环境的访问。全局对象在Node.js中扮演着重要的角色,它使得开发者能够访问和操作Node.js的许多核心功能。本文将详细介绍Node.js的全局对象,包括其特点、常用方法和应用场景…

如何用微信小程序写春联

​ 生活没有模板,只需心灯一盏。 如果笑能让你释然,那就开怀一笑;如果哭能让你减压,那就让泪水流下来。如果沉默是金,那就不用解释;如果放下能更好地前行,就别再扛着。 一、引入 Vant UI 1、通过 npm 安装 npm i @vant/weapp -S --production​​ 2、修改 app.json …

第三章:筑基-React基础篇控制首页大盘搭建

监控和显示: 控制器仪表大盘通常会显示关键的参数、数据和状态信息,帮助操作人员了解系统的运行情况。这些信息可能包括温度、压力、流量、速度等各种传感器数据,以及设备的状态、警报和故障信息等。控制和调节: 通过控制器仪表大盘,操作人员可以对系统进行调节和控制,例…

响应式编程与协程

响应式编程与协程的比较 响应式编程的弊端虚拟线程Java线程内核线程的局限性传统线程池的demo虚拟线程的demo 响应式编程的弊端 前面用了几篇文章介绍了响应式编程&#xff0c;它更多的使用少量线程实现线程间解耦和异步的作用&#xff0c;如线程的Reactor模型&#xff0c;主要…

论文阅读(十五):DNA甲基化水平分析的潜变量模型

1.论文链接&#xff1a;Latent Variable Models for Analyzing DNA Methylation 摘要&#xff1a; 脱氧核糖核酸&#xff08;DNA&#xff09;甲基化与细胞分化密切相关。例如&#xff0c;已经观察到肿瘤细胞中的DNA甲基化编码关于肿瘤的表型信息。因此&#xff0c;通过研究DNA…

【VUE案例练习】前端vue2+element-ui,后端nodo+express实现‘‘文件上传/删除‘‘功能

近期在做跟毕业设计相关的数据后台管理系统&#xff0c;其中的列表项展示有图片展示&#xff0c;添加/编辑功能有文件上传。 “文件上传/删除”也是我们平时开发会遇到的一个功能&#xff0c;这里分享个人的实现过程&#xff0c;与大家交流谈论~ 一、准备工作 本次案例使用的…

【memgpt】letta 课程4:基于latta框架构建MemGpt代理并与之交互

Lab 3: Building Agents with memory 基于latta框架构建MemGpt代理并与之交互理解代理状态,例如作为系统提示符、工具和agent的内存查看和编辑代理存档内存MemGPT 代理是有状态的 agents的设计思路 每个步骤都要定义代理行为 Letta agents persist information over time and…