设计模式:迭代器模式(Iterator)

C# 设计模式:迭代器模式(Iterator Pattern) 首先,我们需要定义一个集合接口,这个接口会声明创建迭代器的方法。// 迭代器接口T Next(); 阅读详情

设计模式:迭代器模式(Iterator)

迭代器模式(Iterator)属于行为型模式(Behavioral Pattern)的一种。

行为型模式(Behavioral Pattern)是对在不同的对象之间划分责任和算法的抽象化。

行为型模式不仅仅关注类和对象的结构,而且重点关注它们之间的相互作用。

通过行为型模式,可以更加清晰地划分类与对象的职责,并研究系统在运行时实例对象之间的交互。在系统运行时,对象并不是孤立的,它们可以通过相互通信与协作完成某些复杂功能,一个对象在运行时也将影响到其他对象的运行。

行为型模式分为类行为型模式和对象行为型模式两种:

  1. 类行为型模式:类的行为型模式使用继承关系在几个类之间分配行为,类行为型模式主要通过多态等方式来分配父类与子类的职责。
  2. 对象行为型模式:对象的行为型模式则使用对象的聚合关联关系来分配行为,对象行为型模式主要是通过对象关联等方式来分配两个或多个类的职责。根据“合成复用原则”,系统中要尽量使用关联关系来取代继承关系,因此大部分行为型设计模式都属于对象行为型设计模式。

模式动机

我们使用的聚合对象各种各样,比如vector、list、tree、map等等,既然是聚合,那就有访问其个体的需要。而遍历访问这个行为可能有深度优先、广度优先、顺序遍历、逆序遍历等等,迭代器的意义就是将这个行为抽离封装起来,这样客户端只需要调用合适的迭代器,来进行对应的遍历,而不用自己去实现这一行为。

模式定义

迭代器模式(Iterator)属于行为型模式。

迭代器模式(Iterator)提供一种方法顺序访问一个聚合对象中各个元素,而不暴露该对象的内部表示。通过迭代器,客户端可以顺序访问聚合对象的元素,而无需了解底层数据结构。

模式结构

迭代器模式(Iterator)包含如下角色:

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

在这里插入图片描述

从上图中,我们可以看到具体容器和具体迭代器两者是相互调用的,也就是说容器调用了迭代器,然后通过迭代器调用了容器内部自身的方法来实现封装。

时序图

略。

模式实现

以 vector 为例,设计了模板类。示例代码如下:

抽象迭代器 Iterator.h:

#ifndef _ITERATOR_H_
#define _ITERATOR_H_

template<typename T>
class Iterator
{
public:
	// 第一个元素
	virtual T first() = 0;
	// 下一个元素
	virtual T next() = 0;
	// 是否到达容器的终点
	virtual bool isDone() = 0;
	// 获取当前元素的指针
	virtual T* currentItem() = 0;
};

#endif // !_ITERATOR_H_

具体迭代器 ConcreteIterator.h:

#ifndef _CONCRETE_ITERATOR_H_
#define _CONCRETE_ITERATOR_H_

#include <vector>
#include "Iterator.h"

template<typename T>
class ConcreteIterator : public Iterator<T>
{
private:
	std::vector<T> m_data;
	int index;

public:
	// 构造函数
	ConcreteIterator(std::vector<T> data) : m_data(data), index(0) {}

	T first()
	{
		return *m_data.begin();
	}
	T next()
	{
		if (isDone())
			return (T)0;
		return m_data[index++];
	}
	bool isDone()
	{
		if (index < m_data.size())
			return false;
		return true;
	}
	T* currentItem()
	{
		if (index < m_data.size())
			return &m_data[index];
		else
			return nullptr;
	}
};

#endif // !_CONCRETE_ITERATOR_H_

抽象聚合 Aggregate.h:

#ifndef _AGGREGATE_H_
#define _AGGREGATE_H_

#include "Iterator.h"
#include "Aggregate.h"

template<typename T>
class Aggregate
{
public:
	// 创建迭代器
	virtual Iterator<T>* createIterator() = 0;
};

#endif // !_AGGREGATE_H_

具体聚合 ConcreteAggregate.h:

#ifndef _CONCRETE_AGGREGATE_H_
#define _CONCRETE_AGGREGATE_H_

#include "ConcreteIterator.h"
#include "Aggregate.h"

template<typename T>
class ConcreteAggregate : public Aggregate<T>
{
private:
	std::vector<T> m_data;

public:
	// 构造函数
	ConcreteAggregate(std::vector<T> data) : m_data(data) {}

	Iterator<T>* createIterator()
	{
		return new ConcreteIterator<T>(m_data);
	}
};

#endif // !_CONCRETE_AGGREGATE_H_

在单线程环境下的测试

测试代码,也可以说是 client:

#include <iostream>
#include <vector>
#include <stdlib.h>

#include "ConcreteIterator.h"
#include "ConcreteAggregate.h"

using namespace std;

int main()
{
	vector<int> data = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
	// 创建容器和迭代器
	ConcreteAggregate<int>* aggregate = new ConcreteAggregate<int>(data);
	Iterator<int>* iterator = aggregate->createIterator();

	// 迭代器输出
	while (!iterator->isDone())
		cout << iterator->next() << " ";
	cout << endl;

	// 清除
	delete iterator;
	delete aggregate;
	iterator = nullptr;
	aggregate = nullptr;

	system("pause");
	return 0;
}

运行结果:

在这里插入图片描述

在多线程环境下的测试

略。

模式分析

  • 迭代器模式提供了一种统一的方式来遍历集合对象中的元素。
  • 它将遍历操作封装到一个独立的迭代器对象中,使得我们可以按照特定的方式访问集合中的元素。
  • 迭代器模式将集合对象和遍历操作分离开来,提高了代码的灵活性和可维护性。
  • 使用迭代器模式可以让我们用相同的方式遍历不同类型的集合对象,而不需要了解集合的内部结构。

优缺点

优点:

  1. 符合单一职责原则。将遍历行为抽离成单独的类。
  2. 符合开闭原则。如果需要增加新的遍历方式,只需实现一个新的具体迭代器即可,不需要修改原先聚合对象的代码。
  3. 简化了集合类的接口,使用者可以更加简单地遍历集合对象,而不需要了解集合内部结构和实现细节。
  4. 将集合和遍历操作解耦,使得我们可以更灵活地使用不同的迭代器来遍历同一个集合,根据需求选择不同的遍历方式。

缺点:

  1. 不适合每种场景:若对聚合对象只需要进行简单的遍历行为,那使用迭代器模式有些大材小用。
  2. 遍历效率降低:在某些情况下,使用迭代器模式可能会导致遍历效率降低,特别是使用外部迭代器时,需要手动进行迭代操作。
  3. 由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性。

适用场景

  1. 访问一个聚合对象的内容而无须暴露它的内部表示。
  2. 需要为聚合对象提供多种遍历方式。
  3. 减少与集合对象的耦合。
  4. 为遍历不同的聚合结构提供一个统一的接口。
  5. 提供一个便利的方法访问一个聚合对象中的每个元素。

应用场景

  1. 集合框架中的迭代器:C++ 的 STL 容器一般都有自己的迭代器。在Java中,集合包括List、Set、Map等等,每个集合类中都提供了一个获取迭代器的方法,例如List提供的iterator()方法、Set提供的iterator()方法等等。通过获取对应的迭代器对象,可以对集合中的元素进行遍历和访问。
  2. JDBC中的ResultSet对象:在Java中,如果需要对数据库中的数据进行遍历和访问,可以使用JDBC操作数据库。JDBC中,查询结果集使用ResultSet对象来表示,通过使用ResultSet的next()方法,就可以像使用迭代器一样遍历和访问查询结果中的数据。
  3. 文件读取:在Java中,我们可以使用BufferedReader类来读取文本文件。BufferedReader类提供了一个方法readLine()来逐行读取文件内容。实际上,BufferedReader在内部使用了迭代器模式来逐行读取文本文件的内容。
  4. Python 使用迭代器和⽣成器来实现迭代模式,iter() 和next() 函数可以⽤于创建和访问迭代器。
  5. JavaScript:ES6中新增了迭代器协议,使得遍历和访问集合元素变得更加方便。

参考

  1. https://zhuanlan.zhihu.com/p/678005837
  2. https://blog.youkuaiyun.com/zhaitianbao/article/details/130097933
  3. https://hermit.blog.youkuaiyun.com/article/details/123429647
  4. https://www.cnblogs.com/ybqjymy/p/17534782.html
  5. https://blog.youkuaiyun.com/qq_42764269/article/details/127382043
  6. https://blog.youkuaiyun.com/K1_uestc/article/details/135772598
  7. https://blog.youkuaiyun.com/weixin_45433817/article/details/131382881
  8. https://www.runoob.com/design-pattern/iterator-pattern.html
馈电网络设计:通过Smith圆图工具完成微带线到同轴探针的阻抗匹配 Smith圆图通过图形化阻抗变换路径,显著简化微带线到同轴探针的匹配设计。设计需结合理论计算(微带线阻抗公式、探针等效模型)、圆图操作(串联/并联元件移动规则)及仿真验证,最终实现宽带低反射匹配。 阅读详情

相关推荐

设计模式第16讲——迭代器模式(Iterator)

迭代器模式是一种行为型设计模式。一、什么是迭代器模式 二、角色组成 三、 优缺点 四、应用场景 4.1 生活场景 4.2 java场景 五、代码实现5.0 UML类图 5.1 Student——学生实体类5.2 StudentIterator——抽象迭代器(Iterator)5.3 StudentListIterator——具体迭代器(Concrete iterator)5.4 StudentAggregate——抽象聚合器(Aggregate)5.5 ClassList

让~学习~成为一种习惯(橡 皮 人の技术博客) 1万+

【HCIE】FRR+BFD+OSPF与BGP联动

FRR+BFD+OSPF与BGP联动

Wenrs的博客 1995

【设计模式——学习笔记】23种设计模式——迭代器模式Iterator(原理讲解+应用场景介绍+案例介绍+Java代码实现)

讲解迭代器模式的思想,介绍其常见的应用场景,举例说明其实现方式

我只管埋头前行,剩下的交给时间。 2729

告别手动解析!用这个Qt库轻松处理Cat 21/62等18种Asterix航空数据

本文介绍了基于Qt框架的高效Asterix报文解析库,帮助开发者轻松处理Cat 21/62等18种航空数据。该库通过协议抽象化、多维度API设计和跨平台支持,解决了手动解析的复杂性和易错问题,显著提升开发效率和系统可靠性。

weixin_42529366的博客 207

DCDC BUCK开关电源PCB设计

在开关电源中,BUCK(降压)电路、BOOST(升压)电路以及BUCK - BOOST(升降压)三种电路是最基本的拓扑结构。转换器又分DCDC(直流转直流)和ACDC(交流转直流),DCDC装换器结构无疑是比ACDC转换器结构简单,所以从DCDC转换器结构入手学习开关电源是一种很好的选择。本文主要从应用角度,进行相关器件的选型计算以及PCB绘制讲解DCDC 12V转5Vbuck电路。

2301_78342510的博客 6882

设计模式-迭代器模式

迭代器模式是一种行为型设计模式,它提供了一种访问集合对象内部元素的方式,而不用暴露集合的内部细节。在迭代器模式中,集合对象和迭代器对象分别负责实现集合和遍历算法,并相互独立地进行演化和修改。这样可以避免暴露集合内部结构,也方便对集合进行扩展和修改。抽象聚合类(Aggregate):定义集合对象的接口,包括添加、删除元素等方法。具体聚合类():实现抽象聚合类接口,存储集合中的元素。抽象迭代器类(Iterator):定义遍历集合的接口,包括获取下一个元素、判断是否还有下一个元素等方法。

BASK2312的博客 456

【python爬虫实战】Python 抓取京东商品信息与评论,做竞品分析

本项目通过爬取京东平台商品数据,实现了完整的电商竞品分析流程。文章首先介绍了项目目标和技术栈,包括Python、Requests、BeautifulSoup等工具。然后详细解析了京东页面结构,包括商品列表页、详情页和评论页的特点。核心部分展示了商品列表爬取、评论数据获取以及竞品分析三个关键步骤的代码实现,每部分都包含运行结果和原理讲解。通过情感分析和关键词提取,项目能够对比不同产品的用户评价差异。最后,文章还讨论了合规性考量、优化建议和常见问题解答。该方案不仅适用于市场调研,也为企业制定营销策略提供了数据支

2503_91057718的博客 1万+

设计模式之迭代器模式

迭代器模式为遍历集合中的元素提供了一种通用接口。其核心思想是,将集合的遍历逻辑与集合对象的实现分离。通过迭代器,客户端代码无需关心集合的底层实现方式(如数组、链表等),就能顺序地访问集合的每一个元素。迭代器设计模式提供了在不暴露对象内部结构的情况下,顺序访问对象集合的有效方法。通过分离集合的实现和遍历逻辑,迭代器模式不仅提高了代码的灵活性,还增强了代码的可维护性。在 Java 集合框架中,迭代器模式有着广泛的应用场景,它极大简化了集合的遍历操作,降低了代码复杂性。

道可道非常道 1219

操作系统权限提升(十五)之绕过UAC提权-基于白名单DLL劫持绕过UAC提权

先将操作在本地执行,使用procmon进行监控,过滤DLL和 NAME NOT FOUND ,寻找可以替换的DLL文件,注意文件的权限是否可以在目录写入,可以看到在C盘的tools目录的文件中有一个srrstr.dll被调用,但是没有加载,我们生成恶意的DLL文件看看是否可以被劫持。在Windows中许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库文件,即dll文件,放置于系统中,个人理解类似于我们编程中引入的模块。将我们生成的DLL文件改名为我们要劫持的DLL文件名。

把自己活成一道光,因为你不知道,谁会借着你的光,走出了黑暗。请保持心中的善良,因为你不知道,谁会借着你的善良,走出了绝望。请保持你心中的信仰,因为你不知道,谁会借着你的信仰,走出了迷茫。请相信自己的力量,因为你不知道,谁会因为相信你,开始相信了自己.... 1873

Openclaw接入大模型API,操作本地windows文件

本文介绍了在WSL2环境下配置OpenClaw使用阿里百炼API的方法。主要内容包括:1)确认WSL2安装完成;2)配置阿里百炼API(需注意Qwen3-Max-Thinking为收费模型);3)提供正确的JSON配置格式示例,强调apiKey必须填写真实值;4)说明配置错误需修改Linux配置文件;5)建议通过询问模型信息验证连接成功。后续将介绍如何切换免费API及本地文件访问功能。

qq_27246521的博客 988

23种设计模式之迭代器模式(Iterator Pattern)

本篇文章将23种设计模式中的迭代器模式,此篇文章为一天学习一个设计模式系列文章,后面会分享其他模式知识。

小威的博客 2万+

米哈游运维面试题及参考答案

Linux 系统运行级别是用于定义系统启动时所需要达到的功能状态。运行级别 0:表示系统停机状态,用于关闭系统,是系统的关机级别。当系统切换到这个级别时,会停止所有的服务和进程,然后关闭系统。运行级别 1:也称为单用户模式。在这个级别下,系统只启动基本的系统服务和必要的进程,仅允许 root 用户登录系统进行维护操作,常用于系统出现故障需要紧急修复的情况,比如修复文件系统错误、重置 root 密码等。运行级别 2:多用户模式,但不支持网络文件系统(NFS)。

大模型大数据攻城狮的专栏 744

设计模式:迭代器模式(Iterator Pattern)

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

TechNomad的博客 837

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

设计模式21:Iterator Pattern (迭代器模式)

可以查看英文原文:http://www.dofactory.com/Patterns/PatternIterator.aspx一、迭代器模式:Iterator PatternDefine:Provide a way to access the elements of an aggregate object sequentially without exposing its underlyi

薛敬明的专栏 1518

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

设计模式教程:迭代器模式(Iterator Pattern)

提供一种方法顺序访问一个集合对象中的各个元素,而又不暴露该对象的内部表示。

遇见伯灵说的博客 1042

C#设计模式:迭代器模式(Iterator Pattern)

一,什么是迭代器模式(Iterator Pattern) 提供一种方法顺序访问一个容器对象中的各个元素,而又不需要暴露该对象的内部表示 二,看下面例子: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading....

dcujcivw769565的博客 166

设计模式精讲 Day 16:迭代器模式(Iterator Pattern)

迭代器模式是一种行为型设计模式,它提供了一种方法来顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示。核心思想是:将集合的遍历逻辑封装到一个独立的迭代器对象中,使得客户端代码可以统一地处理不同的集合类型,而无需关心其具体实现。本节我们深入讲解了迭代器模式,包括它的定义、结构、适用场景、实现方式、工作原理、优缺点以及实际案例。通过学习该模式,我们可以更好地理解如何在不暴露集合内部结构的前提下,实现统一的遍历逻辑。迭代器模式在Java标准库中广泛应用,例如Iterator接口和Iterable接口。

在未来等你的专栏 1152

设计模式:迭代器模式(Iterator Pattern

迭代器模式是一种行为设计模式,它提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示。一句话总结:迭代器模式让不同的集合都能用同样的方式被遍历,就像不同的博物馆都能用同样的导游讲解方式参观。

倔强老吕的博客 600

C++ 设计模式:迭代器模式(Iterator Pattern)

C++ 设计模式:迭代器模式(Iterator Pattern)

冀晓武的博客 859

设计模式十七:迭代器模式(Iterator Pattern)

迭代器模式(Iterator Pattern)是一种行为型设计模式,它提供了一种访问聚合对象(例如列表、集合、数组等)中各个元素的方法,而无需暴露其内部表示。迭代器模式将遍历元素和访问元素的责任分离开来,使得代码更加灵活、可扩展和易于维护。迭代器模式的核心思想是抽象出一个迭代器接口,该接口定义了访问和遍历元素的方法,然后不同的聚合对象实现这个接口以提供自己的迭代器。这样,客户端代码就可以通过迭代器遍历聚合对象中的元素,而无需关心聚合对象的具体实现细节。

qq_40537587的博客 1125

【c++设计模式18】行为模式3:迭代器模式(Iterator Pattern)

迭代器模式定义了一个迭代器接口(Iterator),该接口包含了对容器对象(如列表或集合)进行遍历的方法。具体容器对象(Concrete Collection)实现了迭代器接口,并且提供了创建迭代器对象的方法。迭代器对象(Iterator Object)封装了对容器对象的访问和遍历逻辑。

junxuezheng的博客 1130

Android 设计模式入门到精通之十六:迭代器模式(Iterator Pattern)

设计模式项目源码请移步:https://github.com/caobaokang419/WeatherApp(欢迎Github Fork&amp;Star,代码设计模式&amp;框架设计实现不妥之处,请帮忙指正),谢谢! 迭代器模式(Iterator Pattern) 1. 概念 Provide a way to access the elements of an aggregate...

caobaokang的专栏 377

【图解设计模式系列】The Iterator Pattern: 迭代器模式

什么是迭代器模式? 它提供一种方法顺序的访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。 英文解释: provides a way to access the elements of an aggregate object sequentially without exposing its underlying representation. 那么它究竟是怎么样实现而又不暴漏内部组成呢? 首先 我们看一下一个整洁一点的结构图。 这个模式包含以下四个角色: 抽象聚合(Aggregate)角色:定

Tech in Pieces 407

[设计模式] 行为型:迭代器模式(Iterator Pattern)

文章目录什么是迭代器模式设计与实现 什么是迭代器模式 首先声明一个观点,迭代器模式已经没落了,很少再有人单独写迭代器,除非是偏底层的产品性质的开发。 迭代器在各类应用框架中几乎都有涉及,现成的实现方案及应用都已经很完美了,没必要自己再去费心费力的造一个轮子。 迭代器是为容器服务的,容器就是可以存放许多对象的数据结构,遍历容器中每一个对象元素,就是迭代器最主要的事情。 JDK 1.2版本增加了java.util.Iterator接口,意味着 Java正式引入迭代器模式,并在此后,逐步将迭代器应用到各个容器类中

不忘初心 方得始终 272

设计模式:迭代器模式(Iterator Pattern)

迭代器模式(Iterator Pattern): 属于行为型模式,提供一种遍历集合元素的统一接口,用一致的方法遍历集合元素,不需要知道集合对象的底层表示,即: 不暴露其内部结构。 ...

m0_37564426的博客 327
上一篇: WebRTC 中的 SDP
下一篇: VTK 数据类型:vtkUnstructuredGrid
UestcXiye
博客等级 码龄8年 9028粉丝 1306原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UestcXiye

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值