当前位置: 首页 > news >正文

【设计模式深度剖析】【5】【行为型】【迭代器模式】

👈️上一篇:策略模式

设计模式-专栏👈️

---

文章目录

  • 迭代器模式
  • 定义
    • 英文原话
    • 直译
    • 如何理解呢?
  • 迭代器模式的角色
    • 1. Iterator(迭代器)
    • 2. ConcreteIterator(具体迭代器)
    • 3. Aggregate(聚合)
    • 4. ConcreteAggregate(具体聚合)
    • 类图
    • 代码示例
  • 迭代器模式的应用
    • 迭代器模式的优点
    • 迭代器模式的缺点
    • 迭代器模式的使用场景

迭代器模式

迭代器模式(Iterator Pattern)的关键思想

将对列表的访问和遍历列表对象分离出来并放入一个迭代器(iterator)对象

迭代器模式就像是一个“导游”,它能够引导我们安全、有序地遍历集合中的“景点”,无需我们亲自去探索整个集合的内部结构。

定义

英文原话

The Iterator pattern provides a way to access the elements of an aggregate object sequentially without exposing its underlying representation.

直译

迭代器模式提供了一种顺序访问聚合对象中的元素的方法,而又不需暴露该对象的内部表示。

如何理解呢?

想象一下,我们有一个装满各种水果的篮子(集合),而我们想逐一品尝每种水果(遍历元素)。但我们不希望直接把手伸进篮子里去取水果(暴露内部表示),因为这样可能会把篮子弄乱。

这时,我们可以使用一个迭代器(比如一个长柄勺),它可以帮助我们按顺序从篮子里取出水果,而不需要我们直接接触到篮子内部。每次我们用勺子取出一颗水果后,它就会指向下一个水果的位置。这样,我们就可以轻松品尝完所有的水果,同时保持篮子的整洁和有序。

迭代器模式就是这样一种工具,它让我们能够方便地遍历集合中的元素,同时保持集合的完整性和封装性。在软件开发中,这种模式的应用场景非常广泛,特别是在处理复杂数据结构时,它能够大大提高代码的可读性和可维护性。

迭代器模式的角色

迭代器模式中的角色通常包括:

1. Iterator(迭代器)

定义了访问和遍历元素的接口。

2. ConcreteIterator(具体迭代器)

实现了迭代器接口,并跟踪遍历中的当前位置。

3. Aggregate(聚合)

定义了创建迭代器对象的接口。

4. ConcreteAggregate(具体聚合)

实现了聚合接口,并返回具体迭代器的实例。

类图

在这里插入图片描述

代码示例

// 迭代器接口
interface Iterator {boolean hasNext();Object next();
}// 具体迭代器  
class ConcreteIterator implements Iterator {private List<Integer> list;private int currentIndex = 0;public ConcreteIterator(List<Integer> list) {this.list = list;}@Overridepublic boolean hasNext() {return currentIndex < list.size();}@Overridepublic Object next() {if (this.hasNext()) {return list.get(currentIndex++);}return null;}
}// 聚合接口  
interface Aggregate {Iterator createIterator();
}// 具体聚合  
class ConcreteAggregate implements Aggregate {private List<Integer> list = new ArrayList<>();public void add(Integer item) {list.add(item);}@Overridepublic Iterator createIterator() {return new ConcreteIterator(list);}
}// 客户端代码  
public class Client {public static void main(String[] args) {ConcreteAggregate aggregate = new ConcreteAggregate();// 添加一些元素到聚合对象中  for (int i = 0; i < 10; i++) {aggregate.add(i);}// 获取迭代器并遍历聚合对象  Iterator iterator = aggregate.createIterator();while (iterator.hasNext()) {System.out.print(iterator.next()+"\t");}}
}/* Output:
0	1	2	3	4	5	6	7	8	9	
*///~

在上面的示例中,我们定义了迭代器接口Iterator,它有两个方法:hasNext()用于检查是否还有下一个元素,next()用于获取下一个元素。然后,我们创建了ConcreteIterator类来实现这个接口,并跟踪当前遍历的位置。

Aggregate接口定义了创建迭代器的方法,而ConcreteAggregate类实现了这个接口,并提供了一个List来存储元素,并且有一个方法用于返回ConcreteIterator的实例。

在客户端代码中,我们创建了一个ConcreteAggregate对象,并向其中添加了一些元素。然后,我们获取了一个迭代器,并使用它来遍历聚合对象中的所有元素。

迭代器模式的应用

迭代器模式在软件开发中广泛应用于需要遍历集合对象(如列表、集合、映射等)的场景。它提供了一种统一的方式来访问集合中的元素,而不需要关心集合的内部结构和实现细节。通过迭代器,我们可以顺序地访问集合中的每一个元素,同时保持集合的封装性。

迭代器模式的优点

  1. 简化代码:通过将遍历操作封装在迭代器中,可以避免在客户端代码中编写重复的遍历逻辑,从而简化代码结构。
  2. 支持多种遍历方式:迭代器模式允许我们在不修改原有代码的情况下,通过实现不同的迭代器类来支持多种遍历方式。
  3. 隐藏内部实现:迭代器模式将集合的内部实现与遍历操作分离客户端代码只需要通过迭代器接口访问集合中的元素,无需关心集合的具体实现。
  4. 扩展性好:如果需要添加新的集合类,只需要实现对应的迭代器类即可,无需修改原有代码。

迭代器模式的缺点

  1. 类的个数成对增加:由于迭代器模式将存储数据和遍历数据的职责分离,每增加一个集合类,就需要增加一个对应的迭代器类,这在一定程度上增加了系统的复杂性。
  2. 可能增加系统开销:由于需要创建迭代器对象来遍历集合,这可能会增加一些额外的系统开销。

迭代器模式的使用场景

  1. 内容保密:当需要访问集合对象的内容,但又不希望暴露其内部表示时,可以使用迭代器模式。这样可以保持集合的封装性,同时提供一种统一的访问方式。
  2. 统一接口:当需要为不同的集合结构提供统一的遍历接口时,可以使用迭代器模式。通过实现统一的迭代器接口,可以使得客户端代码更加简洁、可复用。

---

👈️上一篇:策略模式

设计模式-专栏👈️

相关文章:

  • 用例与用例之间的三种关系:泛化、包含、扩展
  • 一些JVM面试题
  • Hive on Spark版本兼容性
  • 2024 年适用于 Mac 的 5 大免费录屏软件
  • Linux之进程信号详解【上】
  • 2024年电子工程与自动化技术国际会议(ICEEAT 2024)
  • Playwright 这个强大的自动化测试工具
  • pdf文件在线压缩网站,pdf文件在线压缩工具软件
  • 3067. 在带权树网络中统计可连接服务器对数目 Medium
  • JVM面试篇(下)
  • selenium的使用教程
  • webshell工具流量特征
  • 【雷丰阳-谷粒商城 】【分布式基础篇-全栈开发篇】【06】【商品服务】接口文档地址_三级分类_SPU_SKU
  • 【创作活动】面对层出不穷的AI大模型产品我们应该怎么选择?
  • 【JavaScript脚本宇宙】通知新风尚:打造互动性十足的Web提示系统
  • 收藏网友的 源程序下载网
  • .pyc 想到的一些问题
  • ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
  • CSS 提示工具(Tooltip)
  • dva中组件的懒加载
  • Linux快速配置 VIM 实现语法高亮 补全 缩进等功能
  • node.js
  • springMvc学习笔记(2)
  • 订阅Forge Viewer所有的事件
  • 对超线程几个不同角度的解释
  • 飞驰在Mesos的涡轮引擎上
  • 分享一份非常强势的Android面试题
  • 小试R空间处理新库sf
  • 用jquery写贪吃蛇
  • 智能合约开发环境搭建及Hello World合约
  • postgresql行列转换函数
  • ​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​
  • #Linux(帮助手册)
  • #我与Java虚拟机的故事#连载19:等我技术变强了,我会去看你的 ​
  • #周末课堂# 【Linux + JVM + Mysql高级性能优化班】(火热报名中~~~)
  • (1)(1.9) MSP (version 4.2)
  • (4)logging(日志模块)
  • (C语言)求出1,2,5三个数不同个数组合为100的组合个数
  • (day 2)JavaScript学习笔记(基础之变量、常量和注释)
  • (ZT)一个美国文科博士的YardLife
  • (二)斐波那契Fabonacci函数
  • (规划)24届春招和25届暑假实习路线准备规划
  • (免费分享)基于springboot,vue疗养中心管理系统
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424
  • (一) storm的集群安装与配置
  • (已解决)什么是vue导航守卫
  • (转)linux 命令大全
  • (转)memcache、redis缓存
  • .bat批处理(二):%0 %1——给批处理脚本传递参数
  • .net(C#)中String.Format如何使用
  • .NET:自动将请求参数绑定到ASPX、ASHX和MVC(菜鸟必看)
  • .NetCore 如何动态路由
  • [240621] Anthropic 发布了 Claude 3.5 Sonnet AI 助手 | Socket.IO 拒绝服务漏洞
  • [AIGC] 解题神器:Python中常用的高级数据结构
  • [Android]一个简单使用Handler做Timer的例子