实用指南:设计模式-迭代器模式(Iterator)

news/2025/11/22 11:38:17/文章来源:https://www.cnblogs.com/yangykaifa/p/19255995

迭代器模式(Iterator)

定义

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

在这里插入图片描述

前言

1. 问题

大部分集合使用简单列表存储元素。但有些集合还会使用栈、树、图和其他复杂的数据结构。

在这里插入图片描述

无论集合的构成方式如何,它都必须提供某种访问元素的方式,便于其他代码使用其中的元素。集合应提供一种能够遍历元素的方式,且保证它不会周而复始地访问同一个元素。

如果你的集合基于列表, 那么这项工作听上去仿佛很简单。但如何遍历复杂数据结构(例如树)中的元素呢?例如,今天你需要使用深度优先算法来遍历树结构,明天可能会需要广度优先算法;下周则可能会需要其他方式(比如随机存取树中的元素)。

在这里插入图片描述

不断向集合中添加遍历算法会模糊其“高效存储数据”的主要职责。此外,有些算法可能是根据特定应用订制的,将其加入泛型集合类中会显得非常奇怪。

另一方面,使用多种集合的客户端代码可能并不关心存储数据的方式。不过由于集合提供不同的元素访问方式,你的代码将不得不与特定集合类进行耦合。

2. 解决方案

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

在这里插入图片描述

除实现自身算法外, 迭代器还封装了遍历操作的所有细节,例如当前位置和末尾剩余元素的数量。因此,多个迭代器可以在相互独立的情况下同时访问集合。

迭代器通常会提供一个获取集合元素的基本方法。客户端可不断调用该方法直至它不返回任何内容,这意味着迭代器已经遍历了所有元素。

**所有迭代器必须实现相同的接口。**这样一来,只要有合适的迭代器, 客户端代码就能兼容任何类型的集合或遍历算法。如果你需要采用特殊方式来遍历集合,只需创建一个新的迭代器类即可,无需对集合或客户端进行修改。

真实世界类比

在这里插入图片描述
你计划在罗马游览数天, 参观所有主要的旅游景点。 但在到达目的地后, 你可能会浪费很多时间绕圈子, 甚至找不到罗马斗兽场在哪里。

或者你可以购买一款智能手机上的虚拟导游程序。 这款程序非常智能而且价格不贵, 你想在景点待多久都可以。

第三种选择是用部分旅行预算雇佣一位对城市了如指掌的当地向导。 向导能根据你的喜好来安排行程, 为你介绍每个景点并讲述许多激动人心的故事。 这样的旅行可能会更有趣, 但所需费用也会更高。

所有这些选择(自由漫步、 智能手机导航或真人向导)都是这个由众多罗马景点组成的集合的迭代器。

结构

在这里插入图片描述

  1. 迭代器(Iterator):接口类,声明了遍历集合所需的操作(获取下一个元素、获取当前位置和重新开始迭代等)。
  2. 具体迭代器(Concrete Iterators) :实现遍历集合的一种特定算法。迭代器对象必须跟踪自身遍历的进度,这使得多个迭代器可以相互独立地遍历同一集合。
  3. 集合(Collection):接口类,声明一个或多个方法来获取与集合兼容的迭代器。请注意,返回方法的类型必须被声明为迭代器接口,因此具体集合可以返回各种不同种类的迭代器。
  4. 具体集合(Concrete Collections) :会在客户端请求迭代器时返回一个特定的具体迭代器类实体。你可能会琢磨,剩下的集合代码在什么地方呢? 不用担心, 它也会在同一个类中。只是这些细节对于实际模式来说并不重要,所以我们将其省略了而已。
  5. 客户端(Client):通过集合和迭代器的接口与两者进行交互。这样一来客户端无需与具体类进行耦合,允许同一客户端代码使用各种不同的集合和迭代器。客户端通常不会自行创建迭代器,而是会从集合中获取。但在特定情况下,客户端可以直接创建一个迭代器(例如当客户端需要自定义特殊迭代器时)。

适用场景

迭代器封装了与复杂数据结构进行交互的细节,为客户端提供多个访问集合元素的简单方法。这种方式不仅对客户端来说非常方便,而且能避免客户端在直接与集合交互时执行错误或有害的操作,从而起到保护集合的作用。

重要迭代算法的代码往往体积非常庞大。当这些代码被放置在程序业务逻辑中时,它会让原始代码的职责模糊不清,降低其可维护性。因此,将遍历代码移到特定的迭代器中可使程序代码更加精炼和简洁。

该模式为集合和迭代器提供了一些通用接口。如果你在代码中使用了这些接口,那么将其他实现了这些接口的集合和迭代器传递给它时,它仍将可以正常运行。

实现方式

  1. 声明迭代器接口。该接口必须提供至少一个方法来获取集合中的下个元素。但为了使用方便,你还可以添加一些其他方法,例如获取前一个元素、记录当前位置和判断迭代是否已结束。
  2. 声明集合接口并描述一个获取迭代器的方法。其返回值必须是迭代器接口。如果你计划拥有多组不同的迭代器,则可以声明多个类似的方法。
  3. 为希望使用迭代器进行遍历的集合实现具体迭代器类。迭代器对象必须与单个集合实体链接。链接关系通常通过迭代器的构造函数建立。
  4. 在你的集合类中实现集合接口。其主要思想是针对特定集合为客户端代码提供创建迭代器的快捷方式。集合对象必须将自身传递给迭代器的构造函数来创建两者之间的链接。
  5. 检查客户端代码,使用迭代器替代所有集合遍历代码。每当客户端需要遍历集合元素时都会获取一个新的迭代器。

优点

缺点

  • 如果你的程序只与简单的集合进行交互,应用该模式可能会矫枉过正。
  • 对于某些特殊集合,使用迭代器可能比直接遍历的效率低。

与其他模式的关系

实例

Iterator.h:

#ifndef ITERATOR_H_
#define ITERATOR_H_
#include <string>// 抽象迭代器class TVIterator{public:virtual void setChannel(int i) = 0;virtual void next() = 0;virtual void previous() = 0;virtual bool isLast() = 0;virtual std::string currentChannel() = 0;virtual bool isFirst() = 0;};#endif  // ITERATOR_H_

ConcreteIterator.h:

#ifndef CONCRETE_ITERATOR_H_
#define CONCRETE_ITERATOR_H_
#include <string>#include <vector>#include "Iterator.h"// 具体迭代器class SkyworthIterator : public TVIterator{public:explicit SkyworthIterator(std::vector<std::string> &tvs) : tvs_(tvs) {}void next() override {if (current_index_ < tvs_.size()) {current_index_++;}}void previous() override {if (current_index_ > 0) {current_index_--;}}void setChannel(int i) override {current_index_ = i;}std::string currentChannel() override {return tvs_[current_index_];}bool isLast() override {return current_index_ == tvs_.size();}bool isFirst() override {return current_index_ == 0;}private:std::vector<std::string> &tvs_;int current_index_ = 0;};#endif  // CONCRETE_ITERATOR_H_

Collection.h:

#ifndef COLLECTION_H_
#define COLLECTION_H_
#include <memory>#include "Iterator.h"// 抽象集合class Television {public:virtual std::shared_ptr<TVIterator> createIterator() = 0;};#endif  // COLLECTION_H_

ConcreteCollection.h:

#ifndef CONCRETE_COLLECTION_H_
#define CONCRETE_COLLECTION_H_
#include <vector>#include <string>#include <memory>#include "Collection.h"#include "ConcreteIterator.h"class SkyworthTelevision : public Television {public:std::shared_ptr<TVIterator> createIterator() {return std::make_shared<SkyworthIterator>(tvs_);}void addItem(std::string item) {tvs_.push_back(item);}private:std::vector<std::string> tvs_;};#endif  // CONCRETE_COLLECTION_H_

main.cpp:

#include <iostream>#include "ConcreteCollection.h"int main() {SkyworthTelevision stv;stv.addItem("CCTV-1");stv.addItem("CCTV-2");stv.addItem("CCTV-3");stv.addItem("CCTV-4");stv.addItem("CCTV-5");auto iter = stv.createIterator();while (!iter->isLast()) {std::cout << iter->currentChannel() << std::endl;iter->next();}return 0;}

编译运行:

$g++ main.cpp -std=c++11 -o iterator
$./iterator
CCTV-1
CCTV-2
CCTV-3
CCTV-4
CCTV-5

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

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

相关文章

2025年热门的力位移监控油压机行业内口碑厂家排行榜

2025年热门的力位移监控油压机行业内口碑厂家排行榜行业背景与市场趋势随着制造业向智能化、精密化方向快速发展,力位移监控油压机作为现代工业生产中的关键设备,其市场需求呈现持续增长态势。据中国液压气动密封件工…

2025年质量好的网带式抛丸机厂家最新权威推荐排行榜

2025年质量好的网带式抛丸机厂家最新权威推荐排行榜行业背景与市场趋势随着中国制造业向高质量发展转型,表面处理设备行业迎来了新一轮增长机遇。据中国铸造协会最新统计数据显示,2024年中国抛丸机市场规模已达到85亿…

免费写论文不用愁!8个AI工具大推荐

本文作者分享了自己为毕业论文发愁,测评 8 款 AI 论文写作工具的经验。这些工具包括瑞达写作、巨鲸写作等。瑞达写作能 30 分钟生成 5 万字初稿,还具备智能改稿等功能;巨鲸写作改稿精准高效;QuillBot 专注语法优化…

2025年评价高的冷拉型钢杭州靠谱装修

2025年评价高的冷拉型钢杭州靠谱装修指南行业背景与市场趋势冷拉型钢作为现代工业制造的重要基础材料,在建筑装修、机械制造、汽车配件等领域发挥着不可替代的作用。根据中国钢铁工业协会最新发布的《2024-2025年中国…

Go MySQL数据库事务处理的机制

MySQL数据库的事务处理机制主要涉及到以下几个方面:事务的定义与特性:事务是由一组SQL语句组成的逻辑处理单元,这些语句要么全部执行成功,要么全部不执行,不允许部分执行。 事务具有ACID特性,即原子性(Atomicit…

2025 最新旅行社品牌推荐!国内优质旅行社权威榜单发布,资质服务双优助力高品质旅行云南旅行社/昆明旅行社服务公司推荐

引言 随着全球旅游市场复苏率突破 85%,消费者对旅行服务的专业化、个性化需求持续攀升,但行业乱象仍未根除。据世界旅游组织(UNWTO)2025 年测评数据显示,全球旅行社合规率仅 72%,隐性消费投诉占比达 38%,资质造…

2025年评价高的自动搅匀排污泵用户好评厂家排行

2025年评价高的自动搅匀排污泵用户好评厂家排行行业背景与市场趋势随着我国城市化进程加快和环保要求日益严格,自动搅匀排污泵作为污水处理系统中的关键设备,市场需求持续增长。据中国通用机械工业协会泵业分会最新统…

模拟赛 R24

T2 - 基站修建 题目描述 A 城计划修建一些通讯基站,因此工程师面临着这样一个问题。 A 城可以抽象为一个 \(3\) 行 \(n\) 列的点阵,其中左上点的坐标为 \((1,1)\),右下点的坐标为 \((3,n)\)。一些位置由于诸多问题可…

2025年靠谱的电力支架行业内知名厂家排行榜

2025年靠谱的电力支架行业内知名厂家排行榜行业背景与市场趋势电力支架作为电力输送系统的重要组成部分,其市场需求随着全球能源基础设施建设的加速而持续增长。根据中国电力企业联合会最新数据,2024年中国电力支架市…

洛谷T699650 [语言月赛 202511] 哈基米:Counting Stars

题目背景 清笳,七海也想与你一同细数繁星。 数很久很久。 题目描述 星空无垠。 一颗星星的方位,可以用球坐标 \((r,\theta,\phi)\) 来描述,其中 \(\theta, \phi\) 为以度为单位的角度,\(r\) 为距离。当 \(\theta, …

08.创建型 - 建造者模式 (Builder Pattern)

建造者模式 (Builder Pattern) 建造者(Builder)模式包含以下4个角色 :产品类(Product):要创建的复杂对象 (包含多个组成部件)抽象建造者类(Builder):这个接口规定要实现复杂对象的哪些部分的创建,并不涉及具体…

2025年热门的半干法脱硫设备最新TOP品牌厂家排行

2025年热门的半干法脱硫设备最新TOP品牌厂家排行行业背景与市场趋势随着全球环保法规日益严格和"双碳"目标的持续推进,半干法脱硫技术凭借其投资成本低、运行费用省、无废水排放等优势,在2025年迎来了新一…

CF2151D 题解

先看同时满足 \(2\),\(3\) 条件的可能的黑格位置(用 # 表示),可以发现当 \(n=5\) 时是这样的: ##### .###. ..#.. ..... .....现在在可能的位置考虑,若现在在第 \(i\) 行还有 \(k\) 个格子可以放黑格,那么方案数…

2025 年 11 月激光焊锡焊接机,激光焊锡全自动生产线最新推荐,聚焦资质、案例、售后的五家机构深度解读!

引言 在精密制造行业高速发展的当下,激光焊锡焊接机与激光焊锡全自动生产线的市场需求持续攀升,成为提升生产效率、保障产品精度的核心装备。然而市场品牌繁杂,设备性能、资质认证、售后服务等差异显著,给企业采购…

2025年质量好的超临界CO₂萃取厂家最新实力排行

2025年质量好的超临界CO₂萃取厂家最新实力排行行业背景与市场趋势超临界CO₂萃取技术作为一种绿色环保的分离技术,近年来在食品、医药、化妆品、石油化工等领域得到广泛应用。根据《2024-2029年中国超临界流体萃取设…

2025年比较好的不锈钢精密铸造铸件TOP实力厂家推荐榜

2025年不锈钢精密铸造铸件TOP实力厂家推荐榜行业背景与市场趋势不锈钢精密铸造作为现代制造业的重要基础工艺,近年来随着高端装备制造、新能源、半导体等产业的快速发展,市场需求持续增长。据《2024-2029年中国精密铸…

2025年比较好的超临界萃取设备厂家最新推荐排行榜

2025年比较好的超临界萃取设备厂家最新推荐排行榜行业背景与市场趋势超临界流体萃取技术作为21世纪绿色分离技术的代表,近年来在食品、医药、化妆品、环保等领域的应用持续扩大。根据《2024-2029年中国超临界萃取设备…

无菌酸奶灌装生产线:工业物联网Modbus RTU 转Modbus TCP 网关应用案例

一、项目背景:无菌酸奶灌装生产线的通讯困境 在工业自动化领域的食品饮料无菌酸奶灌装生产线中,某企业采用西门子 200 SMART PLC(Modbus RTU 协议)负责酸奶原料的杀菌温控、均质压力调节,搭配台达 DVP PLC(Modbu…

2025年质量好的缓冲4D滑轨用户好评厂家排行

2025年质量好的缓冲4D滑轨用户好评厂家排行行业背景与市场趋势随着家居五金行业向智能化、高端化方向发展,缓冲4D滑轨作为现代家具的核心配件,其市场需求呈现稳定增长态势。据《2024-2025中国家居五金行业白皮书》显…

2025年评价高的抗爆防火阀优质厂家推荐榜单

2025年评价高的抗爆防火阀优质厂家推荐榜单行业背景与市场趋势随着建筑安全标准的不断提高和消防法规的日益严格,抗爆防火阀作为建筑消防系统中的关键部件,其市场需求持续增长。据中国消防协会2024年发布的行业报告显…