设计模式: 行为型之中迭代器模式(21)

【设计模式】用Java手写21种常见设计模式 文章目录十二、行为1——模板方法模式十三、行为2——迭代器模式 配套使用效果更佳: 本博客配套开源源码github点击跳转 在《25种常见设计模式思想(上)》中我介绍了4种创建型设计模式和7种结构型设计模式,在此博客中我将继续介绍剩下的x种行为类设计模式。以下是本篇博客的思维导图: 十二、行为1——模板方法模式 模板方法模式非常类似于定制表格,设计者先将所有需要填写的信息头(字段名)抽取出来,再将它们整合在一起成为一种既定格式的表格,最后让填表人按照这个标准化模板去填写自己特有的信息,而不必为书写内容、先 阅读详情

迭代器模式概述

  • 迭代器模式(Iterator Pattern)是 Java 和 .Net 编程环境中非常常用的设计模式
  • 它提供了一种方法顺序访问一个聚合对象中各个元素,而又无须暴露该对象的内部表示,这种模式属于行为型模式
  • 迭代器模式的核心思想是将集合对象的迭代行为抽象到迭代器中,提供一致的接口
  • 使得不同的容器可以提供一致的遍历行为,而不用关心容器内元素的组成结构
  • 这种设计方式解耦了迭代与集合,使得集合对象本身无需关心遍历的逻辑,而迭代器对象则专注于遍历的实现
  • 迭代器模式可以通过实现 Iterator 接口和 Iterable 接口来实现
  • Iterator 接口要求实现一个 next() 方法,该方法返回一个对象,该对象有两个属性:value 和 done
  • value 表示当前的元素值,done 是一个布尔值,表示是否还有更多的元素可以迭代
  • Iterable 接口则要求对象必须有一个 Symbol.iterator 方法,该方法返回一个迭代器对象

迭代器模式应用

// 1. 定义迭代器接口
interface IteratorX<T> {
  next(): { value: T | undefined, done: boolean };
  reset?(): void; // 可选方法,用于重置迭代器到起始位置
}

// 2. 定义聚合对象接口,要求能提供创建迭代器的方法
interface Aggregate<T> {
  createIterator(): IteratorX<T>;
}

// 3. 创建具体聚合对象类
class ConcreteAggregate<T> implements Aggregate<T> {
  private items: T[];

  constructor(...items: T[]) {
    this.items = items;
  }

  createIterator(): IteratorX<T> {
    return new ConcreteIterator(this.items);
  }
}

// 4. 创建具体迭代器类
class ConcreteIterator<T> implements IteratorX<T> {
  private items: T[];
  private currentIndex = 0;

  constructor(items: T[]) {
    this.items = items;
  }

  next(): { value: T | undefined, done: boolean } {
    if (this.currentIndex < this.items.length) {
      const value = this.items[this.currentIndex];
      this.currentIndex++;
      return { value, done: false };
    } else {
      return { value: undefined, done: true };
    }
  }

  // 如果需要,还可以实现重置方法
  reset(): void {
    this.currentIndex = 0;
  }
}

// 使用示例
function main() {
  const aggregate = new ConcreteAggregate<number>(1, 2, 3, 4, 5);
  const iterator = aggregate.createIterator();

  while (true) {
    const { value, done } = iterator.next();
    if (done) break;
    console.log(value); // 输出:1, 2, 3, 4, 5
  }
}

main();
  • 在这个示例中, 定义了 Iterator 接口,其中包含 next 方法,用于返回当前元素和一个布尔值指示是否遍历结束
  • 定义了 Aggregate 接口,要求聚合对象能提供一个创建迭代器的方法
  • ConcreteAggregate 类实现了 Aggregate 接口,并在其构造函数中存储了一系列元素, 它提供了创建 ConcreteIterator 的方法
  • ConcreteIterator 类实现了 Iterator 接口,其中包含了遍历聚合对象元素的逻辑,通过索引跟踪当前位置,并在 next 方法中返回当前元素和遍历状态
  • 在 main 函数中,我们创建了 ConcreteAggregate 对象并获取其迭代器,然后通过迭代器遍历并输出聚合对象的所有元素

迭代器模式的应用场景

  • 迭代器模式的应用场景非常广泛,它特别适用于需要遍历聚合对象且希望提供多种遍历方式的场景

  • 遍历复杂数据结构

    • 当需要遍历如树形结构、图或其他非线性数据结构等复杂的数据结构时,迭代器模式非常有用
    • 通过使用迭代器,我们可以方便地访问这些数据结构中的各个元素,而无需了解它们的底层表示方式
    • 统一遍历接口
      • 当需要为不同的聚合对象提供一个统一的遍历接口时,迭代器模式可以派上用场
      • 例如,当同时处理数组、列表、树等多种数据结构时,通过迭代器模式,我们可以将遍历操作的职责分离出来,由迭代器类统一管理
      • 这样,客户端代码可以通过迭代器来访问不同的聚合对象,而无需关心它们的具体实现细节
    • 提供多种遍历方式
      • 迭代器模式还可以用于提供多种遍历方式
      • 通过实现不同的迭代器类,我们可以以不同的方式遍历同一个聚合对象
      • 这样,客户端代码可以根据需要选择合适的迭代器,从而实现更加灵活的遍历操作
      • 例如,对于同一个树形结构,我们可以实现前序遍历迭代器、后序遍历迭代器等多种迭代器,以满足不同的遍历需求
  • 内容保密与统一接口

    • 在访问集合对象的内容时,迭代器模式允许我们无需暴露其内部表示
    • 这对于那些需要保护数据隐私或隐藏实现细节的场景非常有用
    • 同时,通过为不同的容器类型提供统一的遍历方式,迭代器模式降低了客户端代码与聚合对象之间的耦合度,使得代码更加灵活和可维护
  • 综上所述

    • 迭代器模式在数据处理、数据结构遍历以及接口统一等方面具有广泛的应用价值
    • 通过使用该模式,我们可以简化代码、降低耦合度,并提供更加灵活和可扩展的遍历方式

迭代器模式优缺点


1 ) 优点

  • 封装遍历逻辑

    • 迭代器模式将遍历集合元素的逻辑封装在迭代器对象中,使得客户端代码无需关心集合的内部结构和数据存储方式
    • 只需通过迭代器提供的统一接口进行访问
  • 支持多种遍历方式

    • 针对同一种数据结构,可以通过创建不同的迭代器实现不同的遍历顺序(如正序、逆序、深度优先、广度优先等)
    • 使客户端可以选择合适的遍历方式
  • 简化聚合类

    • 聚合类(如列表、树、图等)无需暴露内部结构(如索引、指针等)来支持遍历,只需提供创建迭代器的方法
    • 这使得聚合类的接口更简洁,同时隐藏了内部实现细节,增强了封装性
  • 符合单一职责原则

    • 将数据存储和数据遍历的职责分离,使得每个类专注于各自的职责
    • 提高了代码的可读性和可维护性
  • 易于扩展

    • 添加新的聚合类或新的遍历方式时,只需增加新的迭代器类
    • 而无需修改现有的客户端代码,符合开闭原则

2 )缺点

  • 增加类的数目
    • 每种数据结构和遍历方式都需要一个对应的迭代器类
    • 可能导致类的数量增多,特别是在需要支持多种遍历方式时
  • 额外的复杂性
    • 对于简单数据结构和简单遍历需求,使用迭代器模式可能会引入不必要的复杂性
    • 在这种情况下,直接使用循环或其他简单的遍历方式可能更为简洁
  • 对集合的修改限制
    • 在迭代过程中,如果同时修改集合(如添加、删除元素)
    • 可能会导致迭代器行为异常或抛出错误,需要特别注意并发修改的问题
    • 某些语言或库提供了安全的迭代器来应对这种情况
  • 无法直接访问特定索引
    • 迭代器通常按顺序访问元素,如果需要直接访问特定索引的元素
    • 可能不如直接使用索引来得直接和高效
  • 综上所述
    • 迭代器模式适用于需要对不同数据结构进行统一遍历操作
    • 且可能需要支持多种遍历方式的场景。对于简单数据结构和简单遍历需求
    • 直接使用基础的循环或索引访问可能更为合适
    • 在使用迭代器模式时,需要权衡其带来的优点(如封装性、扩展性)与可能引入的额外复杂性
C++设计模式 - 迭代器模式 知识的学习在于点滴记录,坚持不懈;知识的学习要有深度和广度,不能只流于表面,坐井观天;知识要善于总结,不仅能够理解,更知道如何表达! 目录设计模式概念迭代器模式简介迭代器模式代码示例 设计模式概念 设计模式简单来说就是在解决某一类问题场景时,有既定的,优秀的代码框架可以直接使用,与我们自己摸索出来的问题解决之道相比较,有以下优点可取: 代码更易于维护,代码的可读性,复用性,可移植性,健壮性会... 阅读详情

相关推荐

小谈设计模式(21)—迭代器模式

就设计模式中的迭代器模式进行讲解分析

AI+全栈,AI+应用,实操落地,前沿技术 1251

Java设计模式 -21- 迭代器模式(Iterator 模式)

Java设计模式 -21- 迭代器模式(Iterator 模式)前言模式的定义与特点优点:缺点:模式的结构与实现1. 模式的结构2. 模式的实现模式的应用场景模式的扩展 前言 行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,它涉及算法与对象间职责的分配。 行为型模式分为类行为模式和对象行为模式,前者采用继承机制来在类间分派行为,后者采用组合或聚合在对象间分配行为。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象行

Android系统工程师--小馬佩德罗 466

C++设计模式16:迭代器模式

迭代器模式是一种行为型设计模式,它允许你在不暴露集合底层表现形式(列表、栈和树等)的情况下遍历集合中所有的元素。迭代器模式通过提供一个迭代器来实现这一点,该迭代器用于跟踪集合中的当前元素,并知道如何遍历到下一个元素。在迭代器模式中,集合类通常会实现一个名为 iterator 的方法,该方法返回一个迭代器对象。迭代器对象通常会实现两个方法:next 和 hasNext。next 方法返回集合中的下一个元素,而 hasNext 方法则用于检查是否还有更多的元素需要遍历。

琅嬛福地 1613

设计模式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

薛敬明的专栏 1519

Java设计模式-迭代器模式(21)

迭代器模式(IteratorPattern)属于行为设计模式的一种,它提供了一种访问集合对象元素的方式,而又不暴露集合的内部结构。迭代器模式定义了一个迭代器接口,用来顺序访问集合对象中的元素,而不需要知道集合对象的底层表示。这样,用户代码可以一致地遍历不同类型的集合,同时集合的内部结构也可以自由地更改,而不会影响到客户端代码。

艾利克斯冰的博客 198

发票OFD格式转换成PDF

发票OFD格式转换成PDF

Be_insighted的博客 934

设计模式--迭代器模式

java深色版本4}java深色版本3}java深色版本36 }710 }1115 }16}迭代器模式通过提供统一的遍历接口,使得遍历集合变得更加灵活和安全。它允许我们在不暴露集合内部实现的情况下遍历集合中的元素,从而增强了代码的封装性和安全性。在需要提供多种遍历方式或需要隐藏集合内部实现的情况下,迭代器模式是一个很好的选择。

MHD0815的博客 580

保姆级教程:用GROMACS的FEP方法计算小分子结合自由能(附完整mdp配置)

本文提供了一份详细的GROMACS自由能微扰(FEP)计算教程,涵盖从系统准备、参数配置到结果分析的全流程。通过具体案例演示如何计算小分子结合自由能,包括λ窗口设计、动力学参数优化及并行化执行技巧,帮助研究者克服FEP计算中的常见问题,获得可靠的自由能数据。

weixin_30598225的博客 354

JAVA设计模式(21):行为型-迭代器模式(Iterator)

20世纪80年代,那时我家有一台“古老的”电视机,牌子我忘了,只记得是台黑白电视机,没有遥控器,每次开关机或者换台都需要通过电视机上面的那些按钮来完成,我印象最深的是那个用来换台的按钮,需要亲自用手去旋转(还要使点劲才能拧动),每转一下就“啪”的响一声,如果没有收到任何电视频道就会出现一片让人眼花的雪花点。当然,电视机上面那两根可以前后左右移动,并能够变长变短的天线也是当年电视机的标志性部件之一,

The Best Or Nothing~ 5504

python多线程实现http代理

python多线程实现http代理文章要求1.py socket模块2.py threading模块3.环境搭建3.1设置代理3.2搭建http简单服务器代码分析1.完整代码2.逻辑结构 文章要求 1.py socket模块 socket模块接触后很简单,我实现的是阻塞性的套接字。 需要了解到,连接套接字,监听套接字,和套接字accept()方法的返回值是元组 数据传递过程sock.recv(1024),sock.send()也不需要转换编码,直接以b"二进制流"传输 2.py threading模块 th

qq_43402663的博客 2508

STM32H750实战:用TIM+DMA驱动ADC/DAC实现音频回环(附CubeMX配置避坑指南)

本文详细介绍了在STM32H750上构建高保真、低延迟音频链路的实战方法。通过配置TIM定时器作为硬件节拍器,精准触发ADC采集与DAC播放,并利用DMA实现数据的自动搬运,全程无需CPU干预。文章重点剖析了CubeMX配置中的关键步骤与常见“坑点”,如ADC的Conversion Data Management模式选择、DMA的FIFO与Burst模式配置,以及STM32H7系列必须开启ADC全局中断等,并提供了完整的代码实现与调试验证指南。

1057

设计模式-21-迭代器模式

一、迭代器模式 迭代器模式(Iterator Pattern)是 Java 和 .Net 编程环境中非常常用的设计模式。这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。 迭代器模式属于行为型模式。 二、介绍 意图:提供一种方法顺序访问一个聚合对象中各个元素, 而又无须暴露该对象的内部表示。 主要解决:不同的方式来遍历整个整合对象。 何时使用:遍历一个聚合对象。 如何解决:把在元素之间游走的责任交给迭代器,而不是聚合对象。 关键代码:定义接口:hasNext, next。

weixin_46147113的博客 199

开源大模型本地部署实战:Llama、DeepSeek、Qwen选型与工程落地指南

大语言模型(LLM)本地部署已成为AI工程化核心环节,其本质不是比拼参数量或榜单分数,而是考察模型架构、推理引擎、量化支持、IDE集成与多模态扩展能力的系统性适配。Llama以纯净Transformer结构成为通用底座,依赖llama.cpp和GGUF量化实现跨平台轻量推理;DeepSeek深度优化代码与数学推理,通过原生OpenAPI、FlashAttention-2及tensor parallelism显著降低API延迟;Qwen则采用模块化设计,支持视觉编码器(Qwen-VL)、生物计算(Qwen-B

weixin_29952383的博客 396

Java设计模式之迭代器模式(UML类图分析+代码详解)

迭代器模式(Iterator Pattern)是常用的设计模式,属于行为型模式。如果我们的集合元素是用不同的方式实现的,有数组,还有java的集合类, 或者还有其他方式,当客户端要遍历这些集合元素的时候就要使用多种遍历 方式,而且还会暴露元素的内部结构,可以考虑使用迭代器模式解决。迭代器模式,提供一种遍历集合元素的统一接口,用一致的方法遍历集合元素, 不需要知道集合对象的底层表示,即:不暴露其内部的结构。

m0_51750419的博客 1921

Livox MID360与Fast-LIO2的实战部署指南:从驱动安装到点云处理

本文提供Livox MID360激光雷达与Fast-LIO2激光惯性里程计从零开始的实战部署指南。详细介绍了Ubuntu系统下的驱动安装、网络配置、点云数据验证以及Fast-LIO2算法的编译、参数配置与联合启动流程,帮助开发者快速搭建移动机器人SLAM系统,并包含关键参数调优与常见故障排查方法。

java5的博客 1026

维护测试监控LLM应用

LangFuse: 开源 + SaaS(免费/付费),LangSmith 平替,可集成 LangChain 也可直接对接 OpenAI API;LangSmith: LangChain 的官方平台,SaaS 服务(免费/付费),非开源,企业版支持私有部署;调试 Prompt 的 Playground测试/验证系统的相关指标数据集管理各种指标监控与统计:访问量、响应时长、Token 费等等。

SunnyRivers 1785

[设计模式笔记]快速小结(三)---行为型模式1

三. 行为行模式 14. Chain Of Responsibility(职责链模式) 意图: 使多个对象都有机会处理请求, 从而避免请求的发送者和接收者之间的耦合关系. 将这些对象连成一条链, 并沿着这条链传递该请求, 直到有一个对象处理它为止. 结构: 图16 说明: 有多少开端, 就有多少条责任链. http://blog.youkuaiyun.com/bagboy_taob

cay22的专栏 1483

matlab计算图像信噪比SNR

【代码】matlab计算图像信噪比SNR。

baidu_34971492的博客 1398

21种设计模式

设计模式 一共23种分为3大类: 创建型设计模式,共 5 种:单例模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式。 结构型设计模式,共 7 种:适配器模式、装饰模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型设计模式,共 11 种:策略模式、模板方法模式、观察者模式、迭代器模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。 创...

weixin_43136017的博客 1038

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

每天记录学习的新知识 :Android 设计模式之行为型

文章目录前言创建型行为型结构型行为型设计模式学习6. 策略模式7. 状态模式8. 观察者模式9. 中介者模式10. 访问者模式11. 迭代器模式12. 模板方法13. 备忘录模式14. 命令模式15. 解释器模式16. 职责链模式 前言 Android 的设计模式分为3大类,一个23种。 创建型 单例模式; 2. Builder模式; 3. 原型模式; 4. 工厂方法; 5. 抽象工厂 行为型 策略模式; 7. 状态模式; 8. 观察者模式; 9. 中介者模式; 10.

嗯... 471

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

每天一个设计模式之迭代器模式(Iterator Pattern)

每天一个设计模式之迭代器模式(Iterator Pattern)

Dive Deep into The Knowledge 313

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

行为型设计模式:对象协作的舞蹈家(上)

一句话理解:当一个对象状态改变时,自动通知所有依赖它的对象,就像新闻发布一样!定义:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。应用场景:事件处理系统、消息推送、数据绑定、日志记录、GUI事件处理一句话理解:定义一系列算法,让它们可以互相替换,就像选择不同的支付方式一样!定义:定义一系列的算法,把它们一个个封装起来,并且使它们可以互相替换。应用场景:支付方式选择、排序算法选择、压缩算法选择、游戏角色技能选择一句话理解。

工一木子 765

技术成神之路:设计模式(十一)迭代器模式

前言迭代器这个词听到并不陌生吧,我们再开发中遍历HashMap 和 HashSet的时候 用到的迭代器和这里的迭代器是一个概念,当然,这个模式不是教你如何去实现的,而是以了解为主。介绍迭代器模式(Iterator Pattern)是一种行为型设计模式,它帮助我们在不暴露集合内部结构的情况下,可以顺序访问集合中的元素。它将集...

cnzzs的博客 412

21种设计模式_读书笔记

以前读的是《heade first设计模式》,现在换《设计模式(刘伟著)》来读。 共有23种常见设计模式,以下为21种设计模式的读书笔记,遗留两种:享元模式和访问者模式。                                     ——引言 (一)最大收获 最大的收获是,以前老是把“建造者模式”和"外观模式"弄混,现在终于分开弄明白了。 书中举的例子并不恰当,搞得像是KFC...

weixin_30734435的博客 114

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

迭代器模式(Iterator):   迭代器模式允许你访问一个数据项序列中的所有元素,而无须关心序列是什么类型(数组、链表、列表或任何其他类型)。它能有效地构建一个数据管道,经过一系列不同的转换或过滤后再从管道的另一端出来。迭代器模式就是提供一种遍历集合元素的统一接口,用一致的方法遍历集合元素,不需要知道集合对象的底层表示。 迭代器模式的角色:      1)抽象迭代器(Iterat...

代码小牛的博客 100

JAVA SCRIPT设计模式--行为型--设计模式之Iterator迭代器模式(16)

CurrentItem操作返回表列中的当前元素,First操作初始化迭代器,使当前元素指向列表的第一个元素,Next操作将当前元素指针向前推进一步,指向下一个元素,而IsDone检查是否已越过最后一个元素,也就是完成了这次遍历。一个聚合对象,如列表(list),应该提供一种方法来让别人可以访问它的元素,而又不需暴露它的内部结构.此外,针对不同的需要,可能要以不同的方式遍历这个列表。但是即使可以预见到所需的那些遍历操作,你可能也不希望列表的接口中充斥着各种不同遍历的操作。这样迭代机制就与具体的聚合类无关了。

火柴盒 520
上一篇: 设计模式: 行为型之中状态模式(20)
下一篇: 设计模式: 行为型之访问者模式(22)
Wang's Blog
博客等级 码龄12年 7434粉丝 2421原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值