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;‍ 希望我们一起努力、成长&…

设计模式之代理模式

写在前面 1&#xff1a;介绍 1.1&#xff1a;什么时候使用代理模式 当我们有对象因为安全性&#xff0c;不能直接对外暴露&#xff0c;或者是需要对对象的操作本身记录日志等信息时就可以考虑使用代理模式&#xff0c; 1.2&#xff1a;UML类图 享元设计模式&#xff0c;包…

五十、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’ 不是内部或外部命令,也不是可运行的程序 或批处理文件。 错误方…

TCP/IP网络编程 第十一章:进程间通信

进程间通信的基本概念 在上一章中我们讲到&#xff0c;进程自身有独立的内存空间&#xff0c;进程之间是相互独立的存在。因此在没有任何机制的支持下&#xff0c;我们可以将进程看作相互孤立的存在。 但是进程之间在某种程度上也是要“交流”的&#xff0c;下面正式介绍进程…

在uni中使用vue3写h5的pdf导出

先安装依赖 npm install --save html2canvas npm install jspdf --save 把dom转canvas&#xff0c;屏幕截图基于 DOM&#xff0c;因此可能不是 100% 准确到真实表示&#xff0c;因为它不会制作实际的屏幕截图&#xff0c;而是根据页面上可用的信息构建屏幕截图。 components…

linux 一键安装docker docker-compose

# 环境 deploy.sh docker-19.03.9.tgz docker-compose-linux-x86_64 tar -zxvf docker-19.03.9.tgz mv docker-19.03.9 docker cp docker/* /usr/bin/ touch /etc/systemd/system/docker.service cat << EOG > /etc/systemd/system/docker.service [Unit] Descripti…

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

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

“深入解析API接口:原理、用途和最佳实践“

API&#xff08;Application Programming Interface&#xff0c;应用程序编程接口&#xff09;是不同软件或系统之间进行交互的桥梁&#xff0c;它提供了一组定义好的规则和功能&#xff0c;使得不同的应用程序能够相互通信和交换数据。API接口的理解、应用和最佳实践对于开发者…

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

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

解决Linux打开文件数过多error:too many open files

解决Linux打开文件数过多error:too many open files #查看当前的最大打开文件数 ulimit -n #默认只有1024,当负载较大的服务器时&#xff0c;很容易遇到error: too many open files。因此&#xff0c;需要将其改大。#可临时修改&#xff0c;但重启后就无效 ulimit -n 65535 #查…

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;包…

【Docker】docker-compose基本使用

【Docker】docker-compose基本使用 文章目录 【Docker】docker-compose基本使用1. docker 项目部署弊端2. docker-compose 简介3. 实践4. 模板命令4.1 build 指令4.2 command 指令4.3 container_name 指令4.4 depends_on 指令4.5 env_file 指令4.6 environment 指令4.7 image 指…

基于Redisson的Redis分布式锁

Redisson分布式锁_redissonclient_甩锅虾的博客-CSDN博客 *** 分布式锁*/ public interface DistributedLock {/*** 尝试获取锁* param lockName* param seconds* return*/Boolean tryAcquire(String lockName, long seconds, TimeUnit unit);/*** 释放锁* param lockKey*/v…

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

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