2023-7-19-第二十式迭代器模式



🍿*★,°*:.☆( ̄▽ ̄)/$:*.°★* 🍿

💥💥💥欢迎来到🤞汤姆🤞的csdn博文💥💥💥
💟💟喜欢的朋友可以关注一下,下次更新不迷路💟💟
😆😆😆私聊获取个人订阅号哦,欢迎订阅共同学习😆😆😆
💖💖💖💖可以加入大家庭群聊,一起学习天天有福利💖💖💖💖





🍬本文摘要

在这里插入图片描述

设计方法二十三式之迭代器模式


目录

  • 🍬本文摘要
  • 😉一、基础概念
  • 🐱‍🐉二、迭代器模式实现
  • 🎉三、模块之间的关系
  • 🐱‍🚀四、注意事项
  • 🎂五、使用场景
  • 🍳参考文献
  • 🧊文章总结



😉一、基础概念

迭代器模式(Iterator Pattern)是一种行为设计模式,它提供了一种顺序访问集合中元素的方法,而无需暴露集合的实现细节。通过使用迭代器,我们可以遍历一个复杂的数据结构,如列表、树或图,而不必了解内部的数据组织方式。

迭代器模式的主要目标是将迭代过程从容器类中分离出来,使得容器和迭代器能够独立地演化,并且可以相互替换。这样,我们可以轻松地编写可重用的迭代器代码,以适应不同类型的集合。

通常,迭代器模式涉及两个核心角色:

  • 迭代器(Iterator):定义了按顺序访问集合元素的接口,包括获取下一个元素、判断是否还有元素等方法。
  • 容器(Container):定义了创建迭代器对象的接口。容器类负责存储数据,并能返回与之关联的迭代器对象。

使用迭代器模式的好处包括:

  • 将集合的访问逻辑与具体的数据结构解耦,提高了代码的灵活性和可维护性。
  • 提供了一种一致的迭代接口,使得客户端代码可以用相同的方式处理不同类型的集合。
  • 允许在不暴露集合内部结构的情况下迭代元素,保护了集合中数据的封装性。

总之,迭代器模式提供了一种简单且灵活的方式来遍历和访问集合中的元素,同时将集合和迭代器解耦,使得代码更加模块化和可复用。


🐱‍🐉二、迭代器模式实现

在 C++ 中,可以使用以下方式来实现迭代器模式:

  1. 定义迭代器接口(Iterator Interface):创建一个抽象的迭代器接口,该接口定义了用于遍历集合的方法,例如 next()hasNext() 等。
class Iterator {
public:virtual void next() = 0;virtual bool hasNext() const = 0;virtual int getCurrent() const = 0;
};
  1. 实现具体迭代器类(Concrete Iterator):实现迭代器接口,并提供具体的遍历逻辑。
class ConcreteIterator : public Iterator {
private:std::vector<int> collection;int currentPosition;public:ConcreteIterator(const std::vector<int>& data) : collection(data), currentPosition(0) {}void next() override {currentPosition++;}bool hasNext() const override {return currentPosition < collection.size();}int getCurrent() const override {return collection[currentPosition];}
};
  1. 定义集合类(Container Class):创建一个集合类,其中包含返回迭代器的方法。
class Container {
private:std::vector<int> data;public:Container(const std::vector<int>& initData) : data(initData) {}Iterator* createIterator() {return new ConcreteIterator(data);}
};

使用示例:

int main() {std::vector<int> data = {1, 2, 3, 4, 5};Container container(data);Iterator* iterator = container.createIterator();while (iterator->hasNext()) {int current = iterator->getCurrent();std::cout << current << " ";iterator->next();}delete iterator;return 0;
}

在上述示例中,我们定义了一个迭代器接口 Iterator,并实现了具体的迭代器类 ConcreteIterator,其中使用了 std::vector 作为集合。然后,我们定义了一个容器类 Container,该类包含创建迭代器对象的方法。最后,在主函数中,我们通过调用容器的 createIterator() 方法获取迭代器,并使用迭代器遍历集合中的元素。

这就是用 C++ 实现迭代器模式的基本步骤。请注意,这只是一个简单的示例,实际情况可能会根据您的需求和数据结构而有所不同。


🎉三、模块之间的关系

在迭代器模式中,存在以下几个核心角色,并且它们之间有着特定的关系:

  1. 迭代器接口(Iterator Interface):定义了遍历集合元素的方法,如 next()hasNext() 等。这个接口通常由一个抽象类或接口来定义。

  2. 具体迭代器(Concrete Iterator):实现迭代器接口,并提供具体的遍历逻辑。它负责跟踪当前位置和判断是否还有下一个元素。

  3. 容器接口(Container Interface):定义了创建迭代器对象的方法。这个接口通常由一个抽象类或接口来定义。

  4. 具体容器(Concrete Container):实现容器接口,并负责存储数据。它通过创建对应的具体迭代器对象来提供对自身数据的遍历。

  5. 客户端(Client):使用容器和迭代器的代码。客户端通过容器接口获取迭代器对象,并使用迭代器接口的方法来遍历容器中的元素。

在迭代器模式中,容器和迭代器是相互依赖的,但彼此分离的。容器负责存储数据并提供创建迭代器的方法,而迭代器负责遍历容器中的元素。客户端代码可以通过容器接口获得迭代器对象,并使用迭代器接口的方法来访问容器中的元素,而不需要了解容器的内部实现细节。

通过这种方式,迭代器模式实现了容器与遍历逻辑之间的解耦,使得容器和迭代器能够独立地演化。它提供了一种统一的方式来处理不同类型的集合,同时提高了代码的可维护性和灵活性。


🐱‍🚀四、注意事项

迭代器模式是一种行为型设计模式,它提供了一种访问集合对象元素的方式,而无需暴露其底层实现细节。在使用迭代器模式时,有几个注意事项需要考虑:

  1. 接口一致性:确保所有的迭代器都实现相同的接口或基类,并且具备相似的方法,这样可以方便客户端代码使用不同类型的迭代器,而无需知道具体的实现。

  2. 迭代器位置管理:迭代器通常会跟踪当前遍历的位置,因此在进行迭代操作之前,需要确认迭代器的初始位置是否正确,以免跳过或重复访问某些元素。

  3. 安全性考虑:当多个迭代器同时对同一个集合进行操作时,可能会发生并发修改的情况。为了确保安全性,可以选择使用不可变的集合对象或者在迭代器中采用加锁的机制。

  4. 遍历完整性:在使用迭代器访问集合元素时,需要确保遍历完整性,即每个元素都能被正确访问到。特别是在使用自定义的迭代器时,需要仔细检查边界条件,避免出现遗漏或重复访问的情况。

  5. 性能影响:迭代器模式在某些情况下可能会对性能产生一定的影响,特别是当遍历大型数据集合时。在这种情况下,可以考虑使用延迟加载的方式来减少内存占用和提高效率。

总之,迭代器模式是一种强大而灵活的设计模式,但在使用时需要注意上述事项,以确保代码的可靠性、安全性和性能。


🎂五、使用场景

迭代器模式适用于以下场景:

  1. 需要遍历集合对象的元素,但又不希望暴露其内部结构:迭代器模式可以将遍历和集合对象分离,使得客户端代码无需了解集合的具体实现细节。

  2. 需要支持多种遍历方式:通过定义不同类型的迭代器,可以实现对同一个集合对象的多种遍历方式,例如正向遍历、反向遍历等。

  3. 需要提供统一的遍历接口:当存在多个类似的集合对象时,可以使用迭代器模式定义一个统一的遍历接口,使得遍历代码更加简洁和可复用。

  4. 需要按需加载集合元素:迭代器模式可以延迟加载集合元素,在需要访问元素时才进行加载,从而减少内存占用。

  5. 需要封装集合对象的遍历算法:通过在迭代器中封装遍历算法,可以使得集合对象能够透明地切换不同的遍历策略,而无需修改客户端代码。

总之,迭代器模式在需要对集合对象进行遍历和访问的情况下,尤其是当我们希望以一种统一的方式来管理和访问集合元素时,是一个非常有用的设计模式。它可以提高代码的灵活性、可复用性,并且能够有效地隐藏集合对象的内部实现细节。


🍳参考文献

🧊文章总结

提示:这里对文章进行总结:

   本文讲了关于迭代器模式的知识。






更多好文推荐

🍸2021-4月Python 机器学习——中文新闻文本标题分类
🍹2021年4月-(计算机网络)小型校园网络模拟搭建,最全最准确版
🍺2022-10-31-基于用户的协同过滤推荐算法实现+MAE+RMSE
🍻2022-11-28-大数据可视化,特征维度大于50
🥂2023-3-9-一篇简短的文章把C++左右值关系讲的透透彻彻

上一篇
End
下一篇

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

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

相关文章

React native 已有项目升级兼容web

基础 概念 | webpack 中文文档 | webpack 中文文档 | webpack 中文网 深入理解Webpack及Babel的使用 - 掘金 Introduction to React Native for Web // React Native for Web Webpack 是一个现代的 JavaScript 应用程序的静态模块打包工具&#xff0c;它将应用程序所依赖的各…

【C++】STL---vector基本用法介绍

个人主页&#xff1a;平行线也会相交&#x1f4aa; 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 平行线也会相交 原创 收录于专栏【C之路】&#x1f48c; 本专栏旨在记录C的学习路线&#xff0c;望对大家有所帮助&#x1f647;‍ 希望我们一起努力、成长&…

五十、Spring

1.Spring概述 1.1 Spring是什么 Spring是分层的 Java SE/EE应用 full-stack(全栈式) 轻量级开源框架。 提供了表现层 SpringMVC和持久层 Spring JDBC Template以及 业务层 事务管理等众多的企业级应用 技术&#xff0c;还能整合开源世界众多著名的第三方框架和类库&#xf…

4个顶级WooCommerce商城多站点库存同步WordPress插件

经营几家网上商店是令人兴奋的。但是&#xff0c;这也是一项艰巨的工作&#xff0c;尤其是当您意识到需要同步这些商店的库存时。好消息是&#xff0c;有 WooCommerce 多站点库存同步插件和选项可以加快速度。 WooCommerce 多站点网络可让您将所有在线商店无缝地安置在一个屋檐…

【Tauri + React 实战】VCluster - 了解技术选型与开发环境配置

VCluster A React Tauri App as visualizer of apps cluster on windows. 背景介绍 VCluster是一个在开发环境下&#xff0c;用以对一系列应用集群&#xff08;如分布式、微服务&#xff09;进行可视化管理的桌面应用程序&#xff0c;目标是实现类似 docker-compose 那样的集…

TabBar和TabBarView实现顶部滑动导航

home.dart子页面主要代码&#xff1a; import package:flutter/material.dart;class HomePage extends StatefulWidget {const HomePage({super.key});overrideState<HomePage> createState() > _HomePageState(); }class _HomePageState extends State<HomePage&…

windows环境hadoop报错‘D:\Program‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。

Hadoop版本为2.7.3&#xff0c;在环境配置好后&#xff0c;检查hadoop安装版本&#xff0c;报如标题所示错误&#xff0c;尝试网上主流的几种方法均无效。 错误&#xff1a;windows环境hadoop报错’D:\Program’ 不是内部或外部命令,也不是可运行的程序 或批处理文件。 错误方…

【技巧】Maven重复依赖分析查找

【技巧】Maven重复依赖分析查找 遇到奇葩的错误可以考虑是不是依赖冲突了 比如同一段代码 再这个项目中好好的 另一个项目中不能用等 idea安装插件 maven helper 打开pom文件 输入要查找的依赖 将不用的排除掉 右键排除即可

在阿里云平台注册一个域名

我们访问阿里云官网 阿里云 然后 我们右上角点击登录 然后 按正常操作流程登录 登录成功后 我们点击控制台 我们将鼠标 移入 右上角 图片指向的位置 我们点击域名 进入界面后点击注册域名 在输入框中输入域名内容 然后 按回车 然后弹出的列表 我们可以选一个未注册的 点击…

Druid-排查conditionDoubleConstAllow配置问题(double const condition)

Druid-排查conditionDoubleConstAllow配置问题(double const condition) 报错信息 Caused by: java.sql.SQLException: sql injection violation, dbType postgresql, druid-version 1.2.18, double const condition : SELECT * FROM test where 11 AND TRUE AND TRUE关键词&…

正则表达式概念以及语法的使用

目录 1.概念 2. 为什么使用正则表达式&#xff1f; 3. 语法 1.普通字符 非打印字符 2. 特殊字符 3. 限定符 4. 定位符 5. 运算优先级 3.匹配规则 1. 基本模式匹配 2. 字符簇 3. 确定重复出现 1.概念 正则表达式(Regular Expression)是一种文本模式&#xff0c;包…

如何使用自动化构造随机路由模型

为什么要仿真随机路由&#xff1f; 路由器测试中&#xff0c;为了最大程度还原现网路由情况&#xff0c;评估路由器在现网环境下稳定工作各项指标&#xff0c;需要对导入路由进行离散仿真&#xff0c;目前路由仿真可分为导入路由与生成路由两种方式&#xff0c;导入路由需要现…

think-on-graph: 基于知识图谱的大模型推理

概述 本文的研究背景是大规模语言模型在复杂推理任务中存在困难并展示了较低的性能&#xff0c;特别是在需要知识的追溯能力、及时性和准确性的场景中。 过去的方法主要面临两个问题&#xff1a;推理不负责任容易生成虚构或带有有害文本&#xff0c;以及模型在预训练阶段无法…

基于IPC-CFX的点对点通信C#

IPC-CFX有两种主要的通信方式&#xff0c;可以通过RabbitMQ发布和订阅&#xff0c;也可以通过request和response进行点对点的通信&#xff0c;本文主要讲的是点对点的通信方式。 在vscode里建立新的dotnet项目&#xff0c;可以通过终端输入dotnet new console来建立&#xff0c…

LCD—STM32液晶显示(2.使用FSMC模拟8080时序)

目录 使用STM32的FSMC模拟8080接口时序 FSMC简介 FSMC NOR/PSRAM中的模式B时序图 用FSMC模拟8080时序 重点&#xff1a;HADDR内部地址与FSMC地址信号线的转换&#xff08;实现地址对齐&#xff09; 使用STM32的FSMC模拟8080接口时序 ILI9341的8080通讯接口时序可以由STM32使…

北邮国院物联网 Microprocessor 微处理器笔记

Introduction-随便聊 嵌入式系统是什么&#xff1f;专用的计算机系统。为专门功能可能对计算机架构&#xff0c;外设等做出一些取舍。 通常的限制&#xff1a;Cost&#xff08;比如大量部署传感器节点&#xff09;&#xff0c;Size and weight limits&#xff08;特定应用场景…

配置Hadoop_0

配置Hadoop_0 1配置Hadoop100模板虚拟机1.1配置Hadoop100模板虚拟机硬件1.2配置Hadoop100模板虚拟机软件1.3配置Hadoop100模板虚拟机IP地址1.4配置Hadoop100模板虚拟机主机名称/主机名称映射1.5配置Hadoop100模板虚拟机远程操作工具 1配置Hadoop100模板虚拟机 Hadoop100 内存…

TRT4-trt-integrate - 1 YOLOV5导出、编译、推理

模型导出 修改Image的Input动态维度 首先可以看到这个模型导出的时候Input有三个维度都是动态&#xff0c;而我们之前说过只需要一个batch维度是动态&#xff0c;所以要在export的export onnx 进行修改&#xff0c;将 torch.onnx.export(model, im, f, verboseFalse, opset_ver…

华为云子网路由表作用及价值

子网路由表 子网路由表作用云专线、VPN的配置与子网路由表强关联&#xff0c;本质是在相应的子网路由表中添加了一条路由Nat路由表问题地址变更问题snat和dnat 子网路由表作用 子网内部作为一个二层网络&#xff0c;通过mac地址互通&#xff0c;不通过路由互通。跨子网&#x…

实时网络更改检测

未经授权的配置更改可能会对业务连续性造成严重破坏&#xff0c;这就是为什么使用实时更改检测来检测和跟踪更改是网络管理员的一项关键任务。尽管可以手动跟踪更改&#xff0c;但此方法往往非常耗时&#xff0c;并且通常会导致人为错误&#xff0c;例如在跟踪时错过关键网络设…