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

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

MMORPG网络游戏开发之任务系统的架构与设计

在网路游戏中做任务已经成为游戏很重要的一个核心功能和玩法,如何做好一个灵活可扩展的任务系统的架构与设计,今天来给大家分享一些我们的设计经验。接下来我把整个的任务系统分成以下6个模块:对于单机游戏而言,这6个模块都放在客户端直接处理,对于网路游戏而言,模块1~5实现在服务端,模块6实现在客户端。对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习unity的零基础小白,也有一些正在从事unity开发的技术大佬,欢迎你来交流学习。...

voidinit的专栏 3049

设计模式——迭代器模式

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

程序猿进阶 2484

openclaw + ollama本地模型 + 飞书平台 windows平台部署教程

本教程将指导您在 Windows 10/11 环境下,通过 Ollama 运行本地模型,并结合 OpenClaw 接入飞书,搭建一个完全本地化的 AI 助手。

专注于技术研发行业技术主要有AI人工智能视觉识别、物联网技术、电商平台、app原生技术、微信小程序、鸿蒙语言开发、办公企业oa、ERP等,致力于做东半球最优秀的程序员 2173

立创开源:基于AD831/ADF4351的250-500MHz宽频调幅信号处理实验电路设计与实现

本文详细解析了基于AD831混频器和ADF4351本振源的250-500MHz宽频调幅信号处理实验电路的设计与实现。文章从项目需求出发,系统讲解了超外差接收架构、核心模块(包括射频前端、混频器、本振源、AGC环路及解调电路)的选型与原理,并提供了实战调试波形与性能验证,为射频电路学习者提供了从理论到实践的完整指南。

weixin_35706255的博客 227

设计模式之迭代器模式

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

五道口 513

STM32F407 HAL库定时器触发ADC采集与DMA数据传输(定时器TIM+ADC+DMA)

在STM32F407系列微控制器的开发中,结合定时器、ADC(模数转换器)与DMA(直接存储器访问)控制器,能够显著提升数据采集与传输的效率。本文将指导你如何使用STM32 HAL库,通过定时器触发ADC1的单通道采集,利用DMA传输数据,最终通过串口将电压值打印出来。具体实现中,我们将读取ADC1的通道5(对应引脚PA5),并将转换得到的电压值发送到串口助手上进行显示。

jmlinux的博客 7012

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

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

张维鹏的博客 1万+

基于OpenCV C++实现工业级形状模板匹配:仿Halcon SBM算法全解析

在计算机视觉和工业自动化领域,模板匹配是一项基础且关键的技术,用于在图像中定位已知目标。其核心原理是通过计算图像区域与预设模板之间的相似度来识别目标位置。传统的基于灰度值的匹配方法对光照变化敏感,鲁棒性不足。而基于边缘梯度方向的形状匹配技术,通过计算轮廓梯度方向的一致性进行相似度度量,从根本上提升了对光照变化的鲁棒性,并支持目标的旋转与缩放,技术价值显著。这项技术广泛应用于工业视觉检测、机器人引导、PCB定位等对精度和稳定性要求极高的场景。本文聚焦于使用开源OpenCV库,从底层仿照Halcon的Shape

weixin_33691817的博客 500

Camera tuning flow相机调试流程

相机调试流程分为三大模块:ProcessRaw处理原始数据(黑电平校正、阴影校正),3A实现自动控制(曝光/对焦/白平衡),ISP进行图像精加工(伽马校正、锐化降噪、色彩处理)。三个阶段环环相扣,前阶段为后阶段提供基础,最终输出画质优良且风格化的图像。

weixin_64706696的博客 1230

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

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

doomwatcher的博客 704

保姆级教程:在Ubuntu 22.04上用Conda搞定nuPlan数据集环境(Python 3.9 + PyTorch)

本文提供了一份详细的Ubuntu 22.04环境下使用Conda配置nuPlan自动驾驶数据集的保姆级教程,涵盖Python 3.9安装、Conda环境管理、PyTorch配置及数据集可视化验证等关键步骤,帮助开发者高效搭建开发环境。

weixin_29061997的博客 254

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

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

Micro麦可乐的博客 3728

inno setup自定义卸载程序和美化

也就是DisplayName,因为我们在第一步的时候,将卸载程序名称也写入了注册表,所以,我们直接从注册表读DisplayName字段即可。1.要实现inno setup自定义卸载程序,首先需要关闭自带的卸载程序。在[Setup]的字段关闭卸载程序步骤和页面。2.删除应用程序目录里能够删除的并且返回进度。3.自定义卸载程序相关的注册表信息。4.删除启动菜单栏和guid注册表。2.自定义快捷方式和程序菜单。

cs821984831的博客 2348

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

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

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

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

qq_33129875的博客 1139

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

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

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

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

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

老版QQ原生表情gif动态

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

您的设计模式——迭代器模式【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、付费专栏及课程。

余额充值