【C++设计模式之迭代器模式】分析及示例

简介

迭代器模式是一种行为型设计模式,它提供了一种顺序访问聚合对象元素的方法,而又不需要暴露聚合对象的内部结构。迭代器模式通过将遍历算法封装在迭代器对象中,可以使得遍历过程更简洁、灵活,并且符合开闭原则。

描述

迭代器模式的核心思想是将数据结构与遍历分离,让客户端能通过迭代器来遍历聚合对象,而不需要直接访问聚合对象的内部数据结构。迭代器模式通过定义一个公共的迭代器接口,包含了获取下一个元素、判断是否还有下一个元素等方法,具体的迭代器类则根据不同的聚合对象实现这些方法。

原理

  1. 定义迭代器接口:定义迭代器的公共方法,通常包括获取下一个元素、判断是否还有下一个元素等。
  2. 实现具体迭代器:根据不同的聚合对象实现迭代器接口中的方法,负责遍历聚合对象并返回元素。
  3. 定义聚合对象:定义聚合对象的数据结构,并提供返回迭代器的方法。
  4. 使用迭代器遍历聚合对象:客户端通过获取迭代器并使用迭代器的方法依次访问聚合对象的元素。

类图

在这里插入图片描述

抽象聚合(Aggregate):也叫抽象容器,定义存储、添加、删除聚合对象以及创建迭代器对象的接口。
具体聚合(ConcreteAggregate):也叫具体容器,实现内部不同结构,返回一个迭代器实例。
抽象迭代器(Iterator):定义访问和遍历聚合元素的接口。
具体迭代器(ConcreteIterator):实现抽象迭代器接口中的方法,完成对聚合对象的遍历,记录遍历的当前位置。

示例

下面是一个使用迭代器模式的简单示例,假设有一个待遍历的自定义集合类MyCollection:

// 迭代器接口
class Iterator {
public:virtual ~Iterator() {}virtual bool hasNext() const = 0;virtual int next() = 0;
};// 具体迭代器
class MyIterator : public Iterator {
public:MyIterator(const std::vector<int>& collection) : collection(collection), index(0) {}bool hasNext() const {return index < collection.size();}int next() {return collection[index++];}private:const std::vector<int>& collection;int index;
};// 聚合对象
class MyCollection {
public:Iterator* createIterator() const {return new MyIterator(elements);}void addElement(int element) {elements.push_back(element);}private:std::vector<int> elements;
};// 客户端
int main() {MyCollection myCollection;myCollection.addElement(1);myCollection.addElement(2);myCollection.addElement(3);Iterator* iterator = myCollection.createIterator();while (iterator->hasNext()) {std::cout << iterator->next() << " ";}std::cout << std::endl;delete iterator;return 0;
}

输出结果

1 2 3

解释

在示例中,首先定义了迭代器接口Iterator,包含了判断是否还有下一个元素(hasNext)和获取下一个元素(next)的方法。然后实现了具体的迭代器MyIterator,它通过存储一个整数向量(collection)和一个索引来实现遍历操作。
接下来定义了聚合对象MyCollection,它具有一个addElement方法用于向集合中添加元素,以及一个createIterator方法用于创建并返回迭代器。
在客户端代码中,创建了一个MyCollection对象,并向其中添加了几个元素。然后通过调用createIterator方法获取迭代器,通过迭代器遍历输出了集合中的元素。

结论

迭代器模式将遍历算法与具体集合对象解耦,使得客户端不需要关心集合的内部结构并能以统一的方式遍历不同类型的集合迭代器模式增强了封装性和灵活性,符合单一职责原则和开闭原则。

应用场景

  • 当需要遍历一个聚合对象,但又不想暴露内部结构时,可以考虑使用迭代器模式。
  • 当需要提供多种遍历方式时,可以为不同的遍历方式实现不同的迭代器。
  • 当需要处理集合对象和遍历算法的耦合问题时,可以考虑使用迭代器模式。

通过迭代器模式的应用,可以使代码更加灵活、易于维护,并实现对集合对象的统一遍历操作。

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

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

相关文章

YOLOv8改进算法之添加CA注意力机制

1. CA注意力机制 CA&#xff08;Coordinate Attention&#xff09;注意力机制是一种用于加强深度学习模型对输入数据的空间结构理解的注意力机制。CA 注意力机制的核心思想是引入坐标信息&#xff0c;以便模型可以更好地理解不同位置之间的关系。如下图&#xff1a; 1. 输入特…

美容美甲小程序商城的作用是什么

美容院往往有很高需求&#xff0c;女性悦己经济崛起&#xff0c;加之爱美化程度提升&#xff0c;无论线下环境还是线上互联网信息冲击&#xff0c;美容服务、化妆产品等市场规格一直稳增不减。 通过【雨科】平台制作美容美甲商城&#xff0c;售卖相关服务/产品&#xff0c;模块…

计算机网络-计算机网络体系结构-概述,模型

目录 一、计算机网络概述 二、性能指标 速率 带宽 吞吐量 时延 往返时延RTT 利用率 三、计算机网络体系结构 分层结构 IOS模型 应用层-> 表示层-> 会话层-> 传输层-> 网络层-> 数据链路层-> 物理层-> TCP/IP模型 一、计算机网络概述 计…

轻松实现视频、音频、文案批量合并,享受批量剪辑的便捷

在日常生活中&#xff0c;我们经常会需要将多个视频、音频和文案进行合并剪辑&#xff0c;以制作出符合我们需求的短视频。然而&#xff0c;这个过程通常需要花费大量的时间和精力。幸运的是&#xff0c;现在有一款名为“固乔智剪软件”的工具可以帮助我们轻松完成这个任务。 首…

Nginx搭建Rtmp流媒体服务,并使用Ffmpeg推流

文章目录 1.rtmp流媒体服务框架图2.nginx配置3.配置nginx4.使用ffmpeg推流5.实时推摄像头流 本项目在开发板上使用nginx搭建流媒体服务&#xff0c;利用ffmpeg进行推流&#xff0c;在pc上使用vlc media进行拉流播放。 1.rtmp流媒体服务框架图 2.nginx配置 下载&#xff1a;wge…

GitHub爬虫项目详解

前言 闲来无事浏览GitHub的时候&#xff0c;看到一个仓库&#xff0c;里边列举了Java的优秀开源项目列表&#xff0c;包括说明、仓库地址等&#xff0c;还是很具有学习意义的。但是大家也知道&#xff0c;国内访问GitHub的时候&#xff0c;经常存在访问超时的问题&#xff0c;…

JVM技术文档--JVM诊断调优工具Arthas--阿里巴巴开源工具--一文搞懂Arthas--快速上手--国庆开卷!!

​ Arthas首页 简介 | arthas Arthas官网文档 Arthas首页、文档和下载 - 开源 Java 诊断工具 - OSCHINA - 中文开源技术交流社区 阿丹&#xff1a; 之前聊过了一些关于JMV中的分区等等&#xff0c;但是有同学还是在后台问我&#xff0c;还有私信问我&#xff0c;学了这些…

[SWPUCTF 2021 新生赛]sql - 联合注入

[SWPUCTF 2021 新生赛]sql 一、思路分析二、解题流程 一、思路分析 这题可以参考文章&#xff1a;[SWPUCTF 2021 新生赛]easy_sql - 联合注入||报错注入||sqlmap 这题相比于参考文章的题目多了waf过滤 二、解题流程 首先&#xff0c;仍然是网站标题提示参数是wllm 1、fuzz看…

10-Node.js模块化

01.模块化简介 目标 了解模块化概念和好处&#xff0c;以及 CommonJS 标准语法导出和导入 讲解 在 Node.js 中每个文件都被当做是一个独立的模块&#xff0c;模块内定义的变量和函数都是独立作用域的&#xff0c;因为 Node.js 在执行模块代码时&#xff0c;将使用如下所示的…

springboot和vue:七、mybatis/mybatisplus多表查询+分页查询

mybatisplus实际上只对单表查询做了增强&#xff08;速度会更快&#xff09;&#xff0c;从传统的手写sql语句&#xff0c;自己做映射&#xff0c;变为封装好的QueryWrapper。 本篇文章的内容是有两张表&#xff0c;分别是用户表和订单表&#xff0c;在不直接在数据库做表连接的…

OLED透明屏交互技术:开创未来科技的新篇章

OLED透明屏交互技术作为一项前沿的科技创新&#xff0c;正在以其高透明度、触摸和手势交互等特点&#xff0c;引领着未来科技的发展。 不仅在智能手机、可穿戴设备和汽车行业有着广泛应用&#xff0c;还在广告和展示领域展现出巨大的潜力。 在这篇文章中&#xff0c;尼伽将深…

【Docker】简易版harbor部署

文章目录 依赖于docker-compose下载添加执行权限测试 安装harbor下载解压修改配置文件部署配置开机自启动登录验证 使用harbor登录打标签上传下载 常见问题 依赖于docker-compose 下载 curl -L “https://github.com/docker/compose/releases/download/2.22.0/docker-compose-…