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

文章目录

  • 简介
  • 问题
  • 解决
    • 代码
    • 设计关键点:
  • 总结

简介

迭代器是一种行为设计模式,让你能在不暴露集合底层表现形式(列表、栈和树等)的情况下遍历集合中所有的元素。

问题

集合是编程中最常使用的数据类型之一。 大部分集合使用简单列表存储元素。但有些集合还会使用栈、树、 图 和其他复杂的数据结构。
无论集合的构成方式是咋样的,它都必须提供某种访问元素的方式,便于 其他代码使用其中的元素。 集合应提供一种能够遍历元素的方式, 并且保证它不会重复地访问同一个元素。
如果你的集合基于列表, 遍历就会比较简单。但怎么遍历复杂数据结构(例如树)中的元素呢? 比如 今天你需要使用深度 优先算法来遍历树结构, 明天可能会需要广度优先算法; 下周则可能会需要其他方式(比如随机存取树中的元素)。 如下图。

需要通过不同的方式遍历相同的集合

这个时候,你可能不断往集合里添加遍历算法,这会让集合本身的职责(“高效存储数据” )变得模糊,不符合单一职责原则。另外 有些算法可能是根据特定应用订制的, 把他加到泛型集合类中会 显得非常奇怪。
另一方面, 使用多种集合的客户端代码可能并不关心存储数据的方式,不过由于集合提供不同的元素访问方式, 你的代码就不得不跟特定集合类进行耦合。

解决

迭代器模式的主要思想是将集合的遍历行为抽取成单独的迭代器对象。

迭代器可实现多种遍历算法。 多个迭代器对象可同时遍历同一个集合

除实现自身算法外, 迭代器还封装了遍历操作的所有细节, 比如当前 位置和末尾剩余元素的数量。 因此,多个迭代器可以在相互独立的情况下同时访问集合。
迭代器通常会提供一个获取集合元素的基本方法。 客户端可以不断调用这个方法直到它不返回任何内容, 也就是说迭代器已经遍历了所有元素。
所有迭代器必须实现相同的接口。这样一来,只要有合适的迭代器,客户端代码就能兼容任何类型的集合或遍历算法。 如果你需要采用特殊方式来遍历集合, 只需创建一个新的迭代器类即可, 不需要对集合或客户端进行修改。

代码

// 1.Iterator接口 (定义遍历标准)
interface TreeIterator<T> {boolean hasNext();T next();
}// 2.Concrete Iterator(实现广度优先遍历)
class BfsIterator implements TreeIterator<TreeNode> {private Queue<TreeNode> queue = new LinkedList<>();public BfsIterator(TreeNode root) {if(root != null) queue.add(root);}public boolean hasNext() {   // 判断是否有下一节点return !queue.isEmpty();}public TreeNode next() {     // 按层遍历树节点TreeNode current = queue.poll();for(TreeNode child : current.getChildren()) {queue.add(child);}return current;}
}// 3.Collection接口(树结构抽象)
interface TreeCollection {TreeIterator<TreeNode> createBfsIterator(); // 创建特定迭代器
}// 4.Concrete Collection(树节点实现)
class TreeNode implements TreeCollection {private String data;private List<TreeNode> children = new ArrayList<>();public TreeNode(String data) { this.data = data; }public void addChild(TreeNode node) {children.add(node);}public List<TreeNode> getChildren() { return children; }public TreeIterator<TreeNode> createBfsIterator() {return new BfsIterator(this); // 自身作为遍历起点}
}// 5.Client使用示例
public class TreeClient {public static void main(String[] args) {/* 构建树结构:A/ \B   C/ \D   E*/TreeNode root = new TreeNode("A");TreeNode nodeB = new TreeNode("B");TreeNode nodeC = new TreeNode("C");root.addChild(nodeB);root.addChild(nodeC);nodeC.addChild(new TreeNode("D"));nodeC.addChild(new TreeNode("E"));// 获取BFS迭代器TreeIterator<TreeNode> iterator = root.createBfsIterator();// 遍历树节点while(iterator.hasNext()) {System.out.println(iterator.next().data); // 依次输出 A → B → C → D → E}}
}

设计关键点:

  1. 解耦遍历算法:BfsIterator封装广度优先的具体逻辑
  2. 扩展性强:新增DfsIterator无需修改树结构代码
  3. 多态迭代:客户端通过统一接口操作不同遍历方式

总结

在这里插入图片描述

  1. (Iterator)接口声明了遍历集合所需的操作:获取下一个元素、 获取当前位置和重新开始迭代等。
  2. (Concrete Iterators)实现遍历集合的一种特定算法。迭代器对象必须跟踪自身遍历的进度。这就让多个迭代器可以相互独立地遍历同一集合。
  3. (Collection) 接口声明一个或多个方法来获取与集合兼容的迭代器。注意,方法返回的类型必须被声明成迭代器接口, 这样具体集合可以返回各种不同种类的迭代器。
  4. (Concrete Collections)会在客户端请求迭代器时返回一个特定的具体迭代器类实体。
  5. (Client) 通过集合和迭代器的接口来和这两者进行交互。 这样一来,客户端不需要跟具体类耦合,允许同一客户端代码使用各种不同的集合和迭代器。 客户端通常不会自行创建迭代器,而是会从集合里获取。但在特定情况下,客户端可以直接创建一个迭代器(比如当客户端需要自定义特殊迭代器时)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/74521.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python 布尔类型

Python 布尔类型(Boolean) 布尔类型是Python中的基本数据类型之一&#xff0c;用于表示逻辑值。它只有两个值&#xff1a; True - 表示真False - 表示假 1. 布尔值的基本使用 # 定义布尔变量 is_active True is_admin Falseprint(is_active) # 输出: True print(is_admi…

人工智能在前端开发中的应用探索

一、人工智能在前端开发中的应用场景 人工智能&#xff08;AI&#xff09;技术的快速发展为前端开发带来了新的机遇和挑战。AI在前端开发中的应用主要集中在以下几个方面&#xff1a;智能代码生成、自动化测试、个性化推荐、智能交互设计以及性能优化。这些应用场景不仅提高了…

三维扫描助力文化遗产数字化保护

当下&#xff0c;三维扫描技术以其独特的优势&#xff0c;正逐渐成为文化遗产数字化保护的重要工具&#xff0c;让珍贵的文物得以“永生”。 三维扫描在文物数字化方面的应用&#xff1a; 高精度文物存档&#xff1a;三维扫描技术能够实现对文物的快速、无损扫描&#xff0c;…

如何将生活场景转换为数据模型模型仿真?

从家到公司有31公里&#xff0c;其中有一个2车道右转立交桥汇入另外一条路&#xff0c;每次都是那个堵车&#xff0c;导致路上的行程在45分钟到70分钟左右&#xff1f;前面或后面路段都是3-4车道&#xff0c;足够通行。如何解决这个难题&#xff0c;是否可搭建数学模型实现可视…

Java学习总结-io流-练习案例

将文档的内容排序&#xff1a; public static void main(String[] args) throws IOException {File dir new File("J:\\360downloads\\wpcache\\srvsetwp\\xxx\\test.txt");BufferedReader br new BufferedReader(new FileReader(dir));//把按行读取到的内容&#…

【C++】STL库_stack_queue 的模拟实现

栈&#xff08;Stack&#xff09;、队列&#xff08;Queue&#xff09;是C STL中的经典容器适配器 容器适配器特性 不是独立容器&#xff0c;依赖底层容器&#xff08;deque/vector/list&#xff09;通过限制基础容器接口实现特定访问模式不支持迭代器操作&#xff08;无法遍历…

LangChain核心解析:掌握AI开发的“链“式思维

0. 思维导图 1. 引言 🌟 在人工智能快速发展的今天,如何有效地利用大语言模型(LLM)构建强大的应用成为众多开发者关注的焦点。前面的课程中,我们学习了正则表达式以及向量数据库的相关知识,了解了如何处理文档并将其附加给大模型。本章我们将深入探讨LangChain中的核心概…

Error:java: 程序包lombok不存在

使用Maven package打包项目发现报错 一、Maven配置文件修改 1.找到本地 maven的配置文件settings.xml 2.修改配置文件中&#xff0c;指向本地仓库的地址使用 ‘’ \ \ ‘’ 隔开&#xff0c; 要么使用 正斜线 / 隔开 不要使用 反斜线 \ windows OS 电脑&#xff0c;使用 \ …

WordPress 未授权本地文件包含漏洞(CVE-2025-2294)(附脚本)

免责申明: 本文所描述的漏洞及其复现步骤仅供网络安全研究与教育目的使用。任何人不得将本文提供的信息用于非法目的或未经授权的系统测试。作者不对任何由于使用本文信息而导致的直接或间接损害承担责任。如涉及侵权,请及时与我们联系,我们将尽快处理并删除相关内容。 0x0…

基于 C# 开发视觉检测系统项目全解析

引言 在当今高度自动化的制造业领域,视觉检测系统的重要性愈发凸显。它凭借高速、高精度的特性,在产品外观缺陷检测、尺寸测量等环节发挥着关键作用,显著提升了生产效率和产品质量。C# 作为一种功能强大且易于学习的编程语言,结合.NET 框架丰富的类库以及 Windows Forms、…

GISBox:核心功能免费的一站式三维GIS处理平台

大家好&#xff0c;今天为大家介绍的软件是GISBox&#xff1a;一款核心功能免费的一站式三维GIS处理平台&#xff0c;主要是适用于数字孪生。下面&#xff0c;我们将从软件的主要功能、支持的系统、软件官网等方面对其进行简单的介绍。 软件官网&#xff1a;http://www.gisbox.…

Ubuntu 24 云服务器上部署网站_详细版_1

从零开始&#xff0c;在 Ubuntu 24 云服务器上部署一个支持登录和权限的网站&#xff0c;用 Python Django 实现&#xff0c;适合新手跟着操作。 &#x1f527; 第一步&#xff1a;更新服务器并安装基础环境 请使用 SSH 登录你的 Ubuntu 24 云服务器&#xff08;用 MobaXterm…

单片机学习之定时器

定时器是用来定时的机器&#xff0c;是存在于STM32单片机中的一个外设。STM32一般总共有8个定时器&#xff0c;分别是2个高级定时器&#xff08;TIM1、TIM8&#xff09;&#xff0c;4个通用定时器&#xff08;TIM2、TIM3、TIM4、TIM5&#xff09;和2个基本定时器&#xff08;TI…

AIGC6——AI的哲学困境:主体性、认知边界与“天人智一“的再思考

引言&#xff1a;当机器开始"思考" 2023年&#xff0c;Google工程师Blake Lemoine声称对话AI LaMDA具有"自我意识"&#xff0c;引发轩然大波。这一事件将古老的哲学问题重新抛回公众视野&#xff1a;​**机器能否拥有主体性&#xff1f;**从东方"天人…

从内核到应用层:Linux缓冲机制与语言缓冲区的协同解析

系列文章目录 文章目录 系列文章目录前言一、缓冲区1.1 示例11.2 缓冲区的概念 二、缓冲区刷新方案三、缓冲区的作用及存储 前言 上篇我们介绍了&#xff0c;文件的重定向操作以及文件描述符的概念&#xff0c;今天我们再来学习一个和文件相关的知识-----------用户缓冲区。 在…

高通camx IOVA内存不足,导致10-15x持续拍照后,点击拍照键定屏无反应,过一会相机闪退

定屏闪退问题分析思路&#xff1a; 定屏问题如果是相机问题&#xff0c;一般会出现返帧&#xff0c;导致预览卡死。当然还有其他情况&#xff0c;我们先看返帧情况&#xff0c;发现request和result开始都正常&#xff0c;到12:53:05.443038就没有返帧了&#xff0c;定屏了。往…

AI知识补全(十五):AI可解释性与透明度是什么?

名人说&#xff1a;一笑出门去&#xff0c;千里落花风。——辛弃疾《水调歌头我饮不须劝》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 上一篇&#xff1a;AI知识补全&#xff08;十四&#xff09;&#xff1a;零样本…

CentOS 7安装hyperscan

0x00 前言 HyperScan是一款由Intel开发的高性能正则表达式匹配库&#xff0c;专为需要快速处理大量数据流的应用场景而设计。它支持多平台运行&#xff0c;包括Linux、Windows和macOS等操作系统&#xff0c;并针对x86架构进行了优化&#xff0c;以提供卓越的性能表现。HyperSc…

机器学习的一百个概念(9)学习曲线

前言 本文隶属于专栏《机器学习的一百个概念》&#xff0c;该专栏为笔者原创&#xff0c;引用请注明来源&#xff0c;不足和错误之处请在评论区帮忙指出&#xff0c;谢谢&#xff01; 本专栏目录结构和参考文献请见[《机器学习的一百个概念》 ima 知识库 知识库广场搜索&…

macvlan 和 ipvlan 实现原理及设计案例详解

一、macvlan 实现原理 1. 核心概念 macvlan 允许在单个物理网络接口上创建多个虚拟网络接口&#xff0c;每个虚拟接口拥有 独立的 MAC 地址 和 IP 地址。工作模式&#xff1a; bridge 模式&#xff08;默认&#xff09;&#xff1a;虚拟接口之间可直接通信&#xff0c;类似交…