设计模式学习笔记--迭代器模式

KEPServerEX实战:Modbus TCP与RTU双协议配置详解 本文详细解析了如何使用KEPServerEX软件同时配置与管理Modbus TCP和RTU混合网络。通过实战步骤,指导用户建立双协议通道、配置设备与标签,并分享核心的地址映射规则与通讯故障排查技巧,帮助工业自动化工程师高效集成多协议设备,简化数据采集架构。 阅读详情

一.简介


今天学习一下设计模式中的迭代器模式,迭代器模式是一种非常非常常用的设计模式,以至于太有用了,C#,Java都将其作为内置实现,C++也提供了STL的迭代器,我们每天都在用,却反倒感觉迭代器模式没那么重要了。毕竟我们自己实现的迭代器还是比不上语言原生提供的实现,但是为了学习,我们还是要看一下迭代器模式的实现,只有了解了原理,才能更好地使用。
我们很多时候都是在处理一组对象,相对的,我们就需要相应的管理容器类来存储对象,.我们需要Add,Remove等方法,但是我们还需要相应的方法来访问容器内的对象。比如获得首个对象First,尾部对象End,下一个对象Next等等方法。如果我们把这些方法都放在容器内实现的话,容器的职责就过重了,而且迭代的方式有所不同,比如我们需要从前向后迭代或者从后向前迭代,我们就可以直接通过更换迭代器来达到不同的效果。通过将迭代部分的内容抽离,我们就可以获得更加灵活的对象访问形式。
下面我们来看一下迭代器模式的定义以及UML类图:
迭代器模式(Iterator Pattern):提供一种方法来访问聚合对象,而不用暴露这个对象的内部表示,其别名为游标(Cursor)。迭代器模式是一种对象行为型模式。

分析一下UML图,我们的容器类就相当于Aggregate,提供一些抽象的容器方法,抽象迭代器类定义了一些迭代方法,比如获得首尾元素,下个元素,当前元素等等,但是具体的迭代方式是通过ConcreteIterator实现的。具体容器类ConcreteAggregate类作为迭代器工厂,可以创建一个本容器对应的迭代器。


二.迭代器模式的例子

我们直接看一下迭代器模式的例子:
// Design Pattern.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
#include <string>
#include <vector>
#include <map>
using namespace std;


//迭代器基类
class Iterator
{
public:
	//迭代器向后指向一个
	virtual void Next() = 0;
	//迭代器指向首元素
	virtual void Begin() = 0;
	//迭代器是否指向容器末尾
	virtual bool IsEnd() = 0;
	//返回当前迭代器所指元素
	virtual string GetCurrent() = 0;
};

//容器基类
class VecterBase
{
public:
	//添加元素
	virtual void Add(string elem) = 0;
	//获得当前元素
	virtual string Get(int index) = 0;
	//获得容器当前容量
	virtual int Count() = 0;
	//迭代器工厂
	virtual Iterator* CreateIterator() = 0;

};

//具体迭代器类
class ConcreteIterator : public Iterator
{
private:
	int m_currentIndex;
	VecterBase* m_vec;
public:
	ConcreteIterator(VecterBase* vec)
		:m_vec(vec)
		,m_currentIndex(0)
	{
	
	}

	virtual void Next() override
	{
		m_currentIndex++;
	}

	virtual void Begin()
	{
		m_currentIndex = 0;
	}
	
	virtual bool IsEnd()
	{
		return m_currentIndex >= m_vec->Count();
	}

	virtual string GetCurrent()
	{
		return m_vec->Get(m_currentIndex);
	}
};

//具体容器类
class ConcreteVector : public VecterBase
{
private:
	vector<string> stringvec;
public:
	void Add(string elem)
	{
		stringvec.push_back(elem);
	}

	string Get(int index)
	{
		return stringvec[index];
	}

	int Count()
	{
		return stringvec.size();
	}

	Iterator* CreateIterator()
	{
		return new ConcreteIterator(this);
	}
};

int _tmain(int argc, TCHAR* argv[])
{
	VecterBase* vec = new ConcreteVector();
	vec->Add("张三");
	vec->Add("李四");
	vec->Add("王二麻子");

	Iterator* it = vec->CreateIterator();
	for (it->Begin(); !it->IsEnd(); it->Next())
	{
		cout << it->GetCurrent() << endl;
	}

	//是不是很像STL里面的迭代器呢?
	/*for (std::vector<string>::iterator it = vec.begin(); it != vec.end(); ++it)
	{
	cout << (*it) << endl;
	}*/

	system("pause");
	
	return 0;
}
结果:
张三
李四
王二麻子
请按任意键继续. . .

我们简单来看一下迭代器,我这里写了一段STL的迭代器代码作为对比,我们的迭代器用法与STL的基本相同。首先创建一个迭代器,初值为容器首元素位置,然后进行迭代,直到到达尾元素为止。每次迭代向后移动一个元素。


三.迭代器模式的总结


最后,我们来看一下迭代器模式的优点,缺点以及使用时机:
优点:
1)迭代器简化了容器类,实现了单一职责原则。将遍历和存储功能分离,不论是新增容器类型还是新增迭代器都符合开放-封闭原则。
2)可以提供多种迭代方式,比如新增一个从后向前迭代的迭代器等。

缺点:
1)迭代器的设计比较难,很难抽象出一套比较完整的迭代器基类。
2)迭代器使系统类个数增加,一定程度上难以理解。

使用时机:
1)访问一个聚合对象的内容而无须暴露它的内部表示。将聚合对象的访问与内部数据的存储分离,使得访问聚合对象时无须了解其内部实现细节。
2)   需要为一个聚合对象提供多种遍历方式。
3)   为遍历不同的聚合结构提供一个统一的接口,在该接口的实现类中为不同的聚合结构提供不同的遍历方式,而客户端可以一致性地操作该接口。

最后,顺带提一句,迭代器模式太有用了,以至于语言或者基础库都提供了完整的迭代器实现,反倒这个模式我们自己实现的意义不大了....

SAPIEN ManiSkill3 入门教程(一) 请注意,table.set_pose(pose) 设置的是演员在世界帧中的坐标系姿势。移除的实体可以再次添加到场景中,但已在场景中的实体则不能再次添加。显示器可以是物理的(如显示器),也可以是虚拟的(如 VNC)。我们可以通过 get_pose()、get_linear_velocity() 和 get_angular_velocity()获取演员的运动量(姿势、线速度、角速度)。现在,让我们创建一个斜坡。例如,您可能需要一个简单的碰撞形状来进行快速模拟,但却需要一个复杂的视觉形状来进行逼真的渲染。 阅读详情

相关推荐

Ansys口腔正畸有限元分析:从几何处理到接触设定的全流程解析

本文详细解析了Ansys在口腔正畸有限元分析中的全流程应用,从几何处理到接触设定,帮助医生精准预测牙齿移动趋势。通过有限元建模技术,可同时观察牙齿-牙周膜-牙槽骨的力学响应,显著提升矫治效果预测准确率。文章还分享了实用技巧和参数设置建议,适用于正畸医生和工程师。

weixin_30897233的博客 348

如何让孩子爱上设计模式 ——16.迭代器模式(Iterator Pattern)

如何让孩子爱上设计模式 ——16.迭代器模式(Iterator Pattern)标签: 设计模式初涉描述性文字本节讲解的是:迭代器模式(Iterator Pattern),说到迭代器,如果你学过Java集合, 相信你对于集合迭代器 Iterator 并不会陌生,比如,遍历一个集合:Iterator iterator = list.iterator(); while(iterator.hasNext

Coder-Pig的猪栏 17万+

避坑指南:处理A股通达信分时数据转日K线时,你可能会遇到的3个时间戳问题

本文针对量化交易中处理A股通达信分时数据转日K线时的常见时间戳问题,提供了专业解决方案。重点解析了午休时段处理、Pandas重采样参数设置及CSV读取时的日期解析陷阱,帮助开发者避免数据预处理错误,提升策略回测准确性。适用于Python量化交易开发者。

weixin_42549496的博客 288

【C++】:STL迭代器使用详解,很好很详细

写在前面,迭代器这种东西,就是为了使访问简单!! 容器::iterator iter; for(iter= 容器.begin();iter!=容易.end();iter++){ coutfirst等等之类的                                    //迭代器就是这么个套路 } 然后就是set,set就是一个集合,仅此而已,而其他的,像是map比较有意

阳光心态,健康人生的博客 3万+

低速信号设计之 LPC 篇

摘要:LPC总线作为服务器低速信号设计的关键技术,在BIOS芯片连接、Super I/O芯片控制和嵌入式管理等方面发挥着重要作用。其采用33MHz时钟频率和4位并行传输机制,理论速率达16.5MB/s。设计时需重点关注布线长度(建议<10cm)、信号完整性(45°走线、合理层间隔离)和过孔优化等要点。典型应用案例表明,通过规范设计可确保在工业控制等复杂环境中稳定工作。LPC总线凭借低成本、低引脚数和良好兼容性,仍是服务器低速外设连接的重要解决方案。

qq_16237389的博客 1164

手把手教你搞定MT6701磁编码器的SSI通信与CRC-6校验(附避坑代码)

本文详细介绍了MT6701磁编码器的SSI通信与CRC-6校验的实现方法,包括硬件连接、时序配置、数据读取和专用CRC-6算法。通过提供避坑代码和常见问题解决方案,帮助开发者快速掌握磁编芯片的调试技巧,确保通信稳定可靠。

weixin_30872337的博客 218

STL库中几种容器及迭代器的使用

C++的STL库:迭代器,顺序容器,关联容器,泛型算法等

忧愁的awe的博客 2364

Embarcadero Dev-C++ 6.3安装教程【保姆级】

Embarcadero Dev-C++ 6.3安装教程,保姆级教程~

Thebest_jack的博客 1万+

我所认识的迭代器模式

什么是简单的,会了就是最简单的^ _ ^,所以我决定带你们手写一个迭代器。想法会在后面去说,等不及的可以翻到后面看一下。

kongkongWorld丶皮皮刀的博客 275

关于基于Midas Civil API的二次开发——PyMiMi

现在写了第一条博客,希望是一个好的开始,能够每天抽出一两个小时或者更多的时间来写写代码,研究研究。我发现在我的工作中存在着大量的重复性工作,对于文档的开发是好办的,毕竟网上有现成库,只需要pip一下拿来用就好,但是对于Midas而言,在24版本之前官方都是没有一个可以使用的接口的,可能mct文件算半个?

ManiacsTraitor的博客 1850

Windows游戏玩家必看:用Process Lasso优化CPU优先级和核心绑定,告别卡顿

本文为Windows游戏玩家详细介绍了如何使用Process Lasso优化系统性能。通过设置CPU优先级和核心绑定,可以智能管理进程资源,确保游戏获得最高调度权限,有效减少因后台程序干扰或Windows调度机制不完善导致的卡顿与帧数波动,从而提升游戏流畅度与稳定性。

weixin_29299807的博客 2217

HeadFirst 设计模式学习笔记9--迭代器模式

本文已搬家至【HeadFirst 设计模式学习笔记】9 迭代器模式

gnuhpc的专栏 3285

088、多摄像头跨镜目标追踪 ID 频繁切换?ReID 特征 + 轨迹关联 + 时间约束方案

文章摘要:本文针对多摄像头跨镜目标追踪中ID频繁切换的问题,提出了一种结合ReID特征、轨迹关联和时间约束的综合解决方案。作者分析了ID切换的三个主要原因:ReID特征不稳定、轨迹关联依赖最近邻匹配以及忽略时间约束。通过改进ReID特征提取(多层特征融合)、引入轨迹预测(卡尔曼滤波)和添加时间窗口约束,成功将ID切换率从35%降至3%以下。文章详细分享了实现细节和踩坑经验,为跨摄像头目标追踪提供了实用优化思路。

ai技术增长的博客 169

学习笔记【23种设计模式-第十六节:Iterator Pattern 迭代器模式】

Iterator Pattern 迭代器模式 简述: 迭代器模式是常用的设计模式,属于行为型模式 如果我们的集合元素使用不同的方式实现的,有数组,还有java的集合类,或者还有其他方式,当客户端要遍历这些集合元素的时候就要使用多种遍历方式,而且还会暴露元素的内部结构,可以考虑使用迭代器模式解决。 迭代器模式,提供一种遍历集合元素的统一接口,用一只的方法遍历集合元素,不需要知道集合对象的底层表示,即:不暴露其内部的结构。 角色 Iterator:迭代器接口,是系统提供的 ConcreteIterator

qq_53273362的博客 141

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

《设计模式》学习笔记——迭代器模式

        迭代器模式(Iterator Pattern)用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。迭代器模式属于行为型模式。 IteratorPattern.h #pragma once #include&lt;iostream&gt; #include&lt;string&gt; // 模拟对象 typedef int Object; #define SIZE 5 ...

smallerxuan的博客 5015

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

设计模式学习笔记之迭代器模式

设计模式学习笔记之迭代器模式

睿不可挡的专栏 795

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

设计模式学习笔记——迭代器模式

迭代器模式据说有人要将它从设计模式中剔除,原因是各种语言基本都内置了这种模式,比如c#的foreach语句,实在是太平常了,不值得特别一提。但我对这个迭代器,尤其是.NET的IEnumerable、IEnumerator甚感迷惑,有必要总结一下。迭代器模式,主要由两部分组成:聚集器和迭代器。聚集器代表数据集合;迭代器用于访问聚集器里的数据。迭代器在聚集器类里面实现,类中类的方式。在.NET里面,聚

左直拳的马桶_日用桶 2954

设计模式学习笔记——14 迭代器模式

迭代器模式 定义 提供一个对象来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示。迭代器模式是一种对象行为型模式 优点 访问一个聚合对象的内容而无须暴露它的内部表示。 遍历任务交由迭代器完成,这简化了聚合类。 它支持以不同方式遍历一个聚合,甚至可以自定义迭代器的子类以支持新的遍历。 增加新的聚合类和迭代器类都很方便,无须修改原有代码。 封装性良好,为遍历不同的聚合结构提供一个统一的接口...

GM. 203

【设计模式学习笔记】迭代器模式

迭代器模式,这是一个很好玩的模式。其实迭代器已经存于集合中了。但是呢,我们可以动手写一个迭代器,并且将其运用在迭代器模式中,而不是在list中。 文章目录           1.1 定义一个迭代器接口及实现           1.2 我们统计生产的车是这样的           1.3 开始记录了           1.4 结果           参考 我们的车间每天都在...

Roger_CoderLife的博客 243

设计模式学习笔记-迭代器模式

一个需求 编写一个学校院系结构。在一个页面中展示出学校的院系组成,如何实现遍历 传统方案解决 会出现的问题 将学院看成是学校的子类,系是学院的子类,这样实际上是站在组织大小来进行分层次的 实际上我们的要去是在一个页面中展示学校院系组成,一个学校有多个学院,一个学院有多个系,因此这种方案,不能很好实现遍历操作 迭代器模式 迭代器模式基本介绍 迭代器模式属于行为型模式 如果我们的集合元素是用不同的方式实现的,有数组,集合类或者还有其他方式,当客户端要遍历这些集合元素的时候就要使用多种遍历方法,而且会暴

我不是什么好人 269

设计模式学习笔记:迭代器模式(Iterator)

文章目录一、迭代器模式介绍二、迭代器模式的优点三、示例四、代码实现五、代码执行结果 虚心使人进步,骄傲使人落后。 一、迭代器模式介绍 迭代器模式属于设计模式中行为型模式的一种。迭代器模式提供了一种方法用于访问聚合对象中的各个元素,而又不暴露该对象的内部表示。 二、迭代器模式的优点 使用迭代器模式可以使得聚合对象中元素的聚合方式改变时,访问者不用修改访问的方式。 例如:聚合对象中元素的聚合方式由数组改为链表,如果不使用迭代器模式,那么访问者遍历聚合对象中元素的代码就要修改,如果使用迭代器模式,只需要修改对

爱辰 996

十六、迭代器模式——设计模式学习笔记

迭代器模式,提供一种方法顺序访问一个聚合对象中各个元素,而有不暴露该对象的内部表示。

L0nginus的博客 394

【学习笔记】设计模式-迭代器模式(Iterator)

文章目录0 设计模式1 迭代器模式2 实现思路3 需要的类4 具体实现4.1 Iterator(迭代器接口)4.2 Container(用户获取迭代器的接口)4.3 NameRepository(实际需要迭代的实体类,实现Container接口)4.4 测试类5 思维导图6 示例源码地址最后 0 设计模式 不了解设计模式的小伙伴可以通过这篇文章了解一下什么是设计模式 https://blog.youkuaiyun.com/qq_42874315/article/details/120006447?spm=1001.20

五条的博客 317

c++设计模式之迭代器模式 学习笔记

学设计模式的伙伴肯定用过STL,而用过STL的应该没有不知道迭代器的,这个模式就是教我们怎么实现迭代器。 迭代器是容器和算法的桥梁,是二者联系的纽带。它提供了遍历容器元素的方法。所以有迭代器就有与之相互匹配的容器。 那么首先回想一下迭代器的几个常用功能: ①获得第一个元素②追踪下一个元素③判断是不是到了最后一个元素了④索引特点index的元素⑤移除固定index的元素… … 然后回想容器的几个常用...

超级无敌大泡泡的博客 164

设计模式学习笔记 --- 17.迭代器模式

迭代器模式(Iterator Pattern)是Java和.Net编程环境中非常常用的设计模式。这种模式用于顺序的访问集合对象的元素,不需要知道集合对象的底层表示。迭代器模式属于行为模式; 意图:提供一种方法顺序访问一个聚合对象中各个元素,而又无需暴露该对象的内部表示; 主要解决:不同的方式来遍历整个整合对象; 何时使用:遍历一个聚合对象; 如何解决:把...

杨鑫newlife的专栏 598
上一篇: 设计模式学习笔记--享元模式
下一篇: Unity对象up轴指向目的方向进行旋转
puppet_master
puppet_master 领域专家: C/C++技术领域 领域专家: C/C++技术领域
博客等级 码龄12年 2695粉丝 161原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值