设计模式系列:一文让你领会“迭代器模式”的用途

C++设计模式 - 迭代器模式 知识的学习在于点滴记录,坚持不懈;知识的学习要有深度和广度,不能只流于表面,坐井观天;知识要善于总结,不仅能够理解,更知道如何表达! 目录设计模式概念迭代器模式简介迭代器模式代码示例 设计模式概念 设计模式简单来说就是在解决某一类问题场景时,有既定的,优秀的代码框架可以直接使用,与我们自己摸索出来的问题解决之道相比较,有以下优点可取: 代码更易于维护,代码的可读性,复用性,可移植性,健壮性会... 阅读详情

基本介绍

通过“迭代”二字我相信大家大概就可以猜出该设计模式的使用场景了。那么大家可能就会有疑问了,遍历还需要设计模式吗?是不是有点过分了?别慌听我慢慢道来。

假设我们的集合是用不同的方式实现的,比如:数组、List、自定义的集合等等……

此时我们想遍历这些集合的话就需要使用不同的方式,并且我们还需要知道集合的内部结构,才能对应的选择适合的遍历方式。这样做的话是不是就有一些繁琐了呢?

为此就衍生出了“迭代器模式”,该模式的设计思想是:提供一种遍历不同集合元素的统一接口,并且无需暴露该集合的内部结构。

“迭代器模式”是属于行为型设计模式的一种。

迭代器模式UML类图

在这里插入图片描述

UML类图讲解

Iterator:迭代器接口。一般使用java内置的接口,该接口提供了遍历时所需的相关方法。
ConcreteIterator:实现了迭代器接口的具体迭代器类。用于迭代集合。
Aggregate:聚合接口。提供了返回迭代器和操作集合的方法。类似于java中的Collection接口。
ConcreteAggregate:实现了聚合接口的具体聚合类。该类含有一个集合并实现了聚合接口定义的方法。
Client:客户端。

注:通过UML类图我们可以发现,迭代器模式将“数据”和“迭代”进行了解耦。在整个结构当中分为两层,其中以Aggregate接口为首的是数据层,以Interator接口为首的是迭代层。

案例讲解

案例:编写一个通用遍历方法,可适用于遍历数组、List等。

迭代器接口使用java.util包下的Iterator接口。

在这里插入图片描述

具体迭代器类

/**
 * 数组迭代器
 */
public class ArrayIterator implements Iterator {

  // 需要遍历的数组
  private String[] array;

  // 遍历的位置
  private int position = 0;

  public ArrayIterator(String[] array) {
    this.array = array;
  }

  /**
   * 是否存在下一个元素
   */
  @Override
  public boolean hasNext() {
    return position < array.length && array[position] != null;
  }

  /**
   * 获取下一个元素
   */
  @Override
  public Object next() {
    return array[position++];
  }
}

/**
 * List迭代器
 */
public class ListIterator implements Iterator {

  // 需要遍历的集合
  private List<String> list;

  // 遍历的位置
  private int position = 0;

  public ListIterator(List<String> list) {
    this.list = list;
  }

  /**
   * 是否存在下一个元素
   */
  @Override
  public boolean hasNext() {
    return position < list.size() && list.get(position) != null;
  }

  /**
   * 获取下一个元素
   */
  @Override
  public Object next() {
    return list.get(position++);
  }
}

聚合接口

/**
 * 聚合接口
 */
public interface Aggregate {

  // 获取一个迭代器
  Iterator createIterator();

}

具体的聚合接口

/**
 * 数组聚合接口
 */
public class ArrayAggregate implements Aggregate {

  // 存放数据的数组
  private String[] array;

  // 记录当前数组对象的个数
  private int num;

  public ArrayAggregate() {
    this.array = new String[3];
  }

  /**
   * 添加元素
   */
  public void add(String value) {
    this.array[num++] = value;
  }

  /**
   * 获取对应的迭代器
   */
  @Override
  public Iterator createIterator() {
    return new ArrayIterator(this.array);
  }
}

/**
 * List聚合接口
 */
public class ListAggregate implements Aggregate {

  // 存放数据的List
  private List<String> list;

  public ListAggregate() {
    this.list = new ArrayList<>();
  }

  /**
   * 添加元素
   */
  public void add(String value) {
    this.list.add(value);
  }

  /**
   * 获取对应的迭代器
   */
  @Override
  public Iterator createIterator() {
    return new ListIterator(this.list);
  }
}

客户端测试类

public class Client {

  public static void main(String[] args) {
    ArrayAggregate arrayAggregate = new ArrayAggregate();
    arrayAggregate.add("小菜鸟");
    arrayAggregate.add("点赞");
    arrayAggregate.add("关注");
    Iterator iterator = arrayAggregate.createIterator();
    while (iterator.hasNext()) {
      System.out.println(iterator.next());
    }
  }
}

执行结果

在这里插入图片描述

总结

1、迭代器模式提供一个统一的遍历元素的方法,客户端无需考虑是什么容器存放的元素。

2、客户端遍历集合时只需要获取一个迭代器即可完成遍历,无需知道聚合类的内部结构。

3、通过迭代器模式我们将管理对象集合和遍历对象集合的责任进行了拆分。这样的好处在于聚合对象和迭代器之间互不影响。这样的设计理念是符合单一职责原则的。

4、迭代器模式也是存在相应的问题的,最直观的问题是每个聚合对象都要有一个迭代器,会产生很多个迭代器类,造成类过多。

今天的分享就到这里了,如果感觉“菜鸟”写的文章还不错,记得点赞加关注呦!你们的支持就是我坚持下去的动力。文章哪里写的有问题的也希望大家可以指出,我会虚心受教。
在这里插入图片描述

深入理解设计模式:迭代器模式详解 在软件开发中,我们经常需要处理各种集合对象,如数组、列表、树形结构等。如何高效、统一地遍历这些集合对象,同时又不暴露其内部结构,是一个常见的设计挑战。迭代器模式(Iterator Pattern)正是为解决这一问题而生的经典设计模式。本文将全面剖析迭代器模式的原理、实现、应用场景以及在实际开发中的最佳实践。 阅读详情

相关推荐

设计模式--迭代器模式java例子

设计模式--迭代器模式java例子

设计模式 (十七) 迭代器模式

一、概念 概念:迭代器模式,又叫做游标模式,指的是提供一种方法访问一个容器对象中各个元素,而又不需要暴露该对象的内部细节,迭代器模式属于行为型模式。 通用UML类图: 角色分析: 抽象迭代器角色(Iterator):通常情况下定义了访问和遍历元素的接口; 具体迭代器角色(ConcreteIterator):需要实现抽象迭代器接口并且实现其中的抽象方法, 实现对聚合对象的遍历并要记录遍历...

weixiaohuai的博客 754

Cadence Allegro PCB文件对比实战:3分钟搞定两份设计差异(附颜色标注技巧)

本文详细介绍了如何高效使用Cadence Allegro的Design Compare功能进行PCB文件差异对比。通过实战工作流,可在3分钟内精准定位并理解两份设计在布局、布线、元件等方面的关键差异,并分享了自定义颜色标注技巧,帮助工程师快速聚焦重要修改,提升设计评审与团队协作效率。

weixin_29248653的博客 379

设计模式——迭代器模式

在程序设计中,经常需要访问一个聚合对象中的各个元素,例如:我们使用 list 存储元素,通常的做法是将 list 的创建和遍历放在同一个类中。但这种方法不利于扩展,如果将存储方式更改为数组时,就需要更换迭代方式。违背了 “开闭原则”。“迭代器模式” 能较好的克服以上缺点,它在客户访问类与聚合类之间插入一个迭代器,这分离了聚合对象与遍历行为,对客户也隐藏了其内部细节,满足 “单一职责原则” 和 “开闭原则”,如 Java 中的 Collection、List、Set、Map 等都包含迭代器。 一、迭代模.

程序猿进阶 2484

保姆级教程:用TI IWR6843雷达板跑通3D人体追踪demo(附CCS/UniFlash避坑指南)

本文提供了一份详尽的TI IWR6843毫米波雷达开发板3D人体追踪demo实现指南,涵盖开发环境搭建、工程导入编译、固件烧录及可视化工具配置全流程。特别针对CCS和UniFlash使用中的常见问题给出解决方案,帮助开发者快速掌握3D People Tracking技术应用。

weixin_29159441的博客 504

跟着团子学SAP CO:揭秘结果分析码在项目结算中的实战应用(一)KKA2/CJ88

本文深入解析了SAP CO模块中结果分析码在项目结算中的核心作用。以KKA2(方法10)和事务代码CJ88为例,详细阐述了如何在项目完工后一次性确认收入的场景下,通过结果分析功能实现收入与成本的精准匹配,将项目成本暂估为在制品,确保各期利润的准确反映。

gamma的博客 685

设计模式之迭代器模式

迭代器模式(Iterator Pattern)提供了一个方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示。 迭代器模式简介迭代器模式(Iterator Pattern)是Java中常用的设计模式,主要用在遍历整个集合对象。

五道口 513

开源 AHB不对称半桥反激电路设计(六)死区时间,谐振腔电流,谐振电感函数表达式

电流跌落可以使副边电流峰值和有效值降低,减小损耗,但如果开关管 S2 导通期间,谐振电流谐等于励磁电流,即副边电流A 点降至 0,会在原边变压器内形成环流,产生损耗,同时也不利于副边同步整流管驱动的正常工作,为了保证开关管 S2 导通期。在开关管 S1 和开关管 S2 均关断的死区时间内,谐振电流给原边开关管结电容和副边整流管结电容充放电,因此会引起开关 S1 关断瞬间电流跌落与开关 S2 关断瞬间电流震荡现象,受寄生参数影响原边谐振电流波形和副边电流波形如图。降到最低,变压器以最高效率向副边传递能量。

【Simon】的博客 1228

Java设计模式之行为型:迭代器模式

迭代器模式提供一种访问集合中的各个元素,而不暴露其内部表示的方法。将在元素之间游走的职责交给迭代器,而不是集合对象,从而简化集合容器的实现,让集合容器专注于在它所应该专注的事情上,更加符合单一职责原则。

张维鹏的博客 1万+

TSP、MTSP问题遗传算法详细解读及python实现

写在前面 遗传算法是一种求解NPC问题的启发式算法,属于仿生进化算法族的一员。仿生进化算法是受生物行为启发而发明的智能优化算法,往往是人们发现某种生物的个体虽然行为较为简单,但生物集群通过某种原理却能表现出智能行为。于是不同的人研究不同的生物行为原理,受到启发而发明出新的仿生进化算法。比如免疫优化算法,蚁群算法,模拟退火算法等,这些算法以后也会简单介绍。 本文的主题是遗传算法,该算法也是受到生物行为启发。物竞天择,适者生存,优胜劣汰,是该优化算法的核心思想。笔者在业务中需要用到遗传算法求解TSP问题,但是网

weixin_47675950的博客 9306

Zotero PDF Translate插件实战:DeepL API免费申请与高效翻译配置指南

本文提供Zotero PDF Translate插件配置DeepL API的完整实战指南。详细介绍了如何免费申请DeepL API密钥,解决国内访问问题,并在插件中完成精细配置,实现文献阅读时的无缝划词翻译,大幅提升科研人员和学生的英文文献阅读效率。

rum55的博客 457

图解设计模式:动动手玩转迭代器模式

📣 📣 📣 📢📢📢☀️☀️点开就是缘分认识一下,我是小冷。是一个兴趣驱动自学练习两年半的的Java工程师。

doomwatcher的博客 704

【时时三省】vector cast (vcast) 集成测试使用教程

山不在高,有仙则名。水不在深,有龙则灵。----优快云 时时三省。

时时三省的博客 708

津津乐道设计模式 - 迭代器模式详解(以购物车的场景来演示迭代器模式)

本章节主要介绍了迭代器模式、迭代器模式适用场景、迭代器模式的优缺点,并以购物车的场景来演示迭代器模式,如果本文对你有用,欢迎关注收藏评论,后续将陆续推出更多优质的博文与大家一起分享交流~

Micro麦可乐的博客 3728

大规模新闻聚合爬虫实战:Python爬取数百万新闻数据的完整指南

本文详细介绍了如何构建一个大规模新闻聚合爬虫,结合Python异步爬虫技术,实现高效、稳定的新闻数据采集。增加NLP模块对新闻内容做自动分类、情感分析。引入机器学习模型检测新闻真实性。使用分布式爬虫框架进一步提升规模。增加多媒体内容抓取与处理。

2201_76125261的博客 1554

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

java设计模式学习之【迭代器模式】

这篇教程不仅提供了迭代器模式的理论基础,还通过具体的Java代码示例展示了如何实现和应用这种模式。简单理解,通俗易懂

qq_33129875的博客 1139

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

【迭代器模式】设计模式系列:从理论到实践的全面解析

本文全面解析了迭代器模式的核心概念及其在现代软件开发中的应用。从基础定义到高级主题如泛型、Lambda 表达式及 Stream API 的结合使用,再到最佳实践和案例研究,为读者提供了一套实用指南。探讨了迭代器模式在函数式编程、异步和并发编程中的重要性,并展望了其在未来技术趋势中的应用前景。对于希望提升代码质量和效率的开发者而言,本文是一份不可或缺的资源。

欢迎来到我的技术空间!我是一名经验丰富的Java开发工程师,热衷于分享我在软件开发领域的知识和心得。在这个博客里,您会发现一系列关于Java编程的文章,包括最佳实践、技术趋势、代码优化技巧以及一些有趣的项目案例。无论是初学者还是有经验的开发者,都能在这里找 1475

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

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

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

557

详解设计模式:迭代器模式

迭代器模式(Iterator Pattern)也被称为游标模式(Cursor Pattern),是在 GoF 23 种设计模式中定义了的行为型模式。是一种最简单也最常见的设计模式。 迭代器模式 可以让用户透过特定的接口巡访容器中的每一个元素而不用了解底层的实现。 本篇文章内容包括:关于迭代器模式、观察者模式 Demo、模版方法模式的应用(ArrayList/Iterator 中的迭代器模式)

栗筝i的博客 3841

【设计模式】迭代器模式

【设计模式】迭代器模式——行为型模式。提供一个对象来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示。以上就是设计模式之迭代器模式【行为型模式】的相关知识点,希望对你有所帮助。积跬步以至千里,积怠惰以至深渊。时代在这跟着你一起努力哦!

浩泽学编程的博客 2058

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

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

Lu_1u的博客 546

设计模式-迭代器模式

设计模式中迭代器模式的讲解及代码示例

m0_68810055的博客 1340

【设计模式系列】迭代器模式(七)

迭代器模式(Iterator Pattern)是一种行为型设计模式,。迭代器模式将集合的遍历过程封装在一个独立的迭代器对象中,这样客户端代码就可以通过迭代器来访问集合,而不需要了解集合的内部结构。

LHW0621的专栏 1268

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

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

小威的博客 2万+
上一篇: 设计模式系列:一文带你领略“访问者模式”的魅力
下一篇: 升职加薪必备技能:设计模式之——观察者模式
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值