迭代器模式【行为模式C++】

1.简介

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

迭代器的意义就是将这个行为抽离封装起来,这样客户端只需要调用合适的迭代器,来进行对应的遍历,而不用自己去实现这一行为。

2、结构


迭代器模式主要由以下几个结构组成:

迭代器(Iterator):定义访问和遍历聚合对象中元素的接口,包括获取下一个元素、判断是否还有下一个元素等方法。
具体迭代器(Concrete Iterator):实现迭代器接口,存储聚合对象的当前状态,负责遍历聚合对象中的元素。
聚合对象(Aggregate):定义创建相应迭代器对象的接口,一般是一个集合类,如列表、数组等。
具体聚合对象(Concrete Aggregate):实现聚合对象接口,创建具体迭代器对象,可以通过实现不同的聚合对象来提供不同方式的遍历。

在迭代器模式中,客户端通过获取聚合对象的迭代器,使用迭代器的方法遍历聚合对象中的元素,而无需暴露聚合对象的内部表示。这样可以提高系统的灵活性和可扩展性,同时也降低了聚合对象与迭代器之间的耦合度。

3、实现方式

3.1、案例引入

说到迭代器,大家应该很容易就想到在集合中的迭代器遍历集合的场景,这里我们就通过迭代器模式,自定义简单的集合和迭代器,模拟使用迭代器遍历集合的场景。

3.2、结构分析

在上述场景中,结构分别对应迭代器模式中的角色:

Container:对应迭代器模式中的抽象聚合类
ConcreteContainer:对应迭代器模式中的具体的聚合类
Iterator:对应迭代器模式中的抽象迭代器类;
ConcreteIterator:对应迭代器模式中的具体迭代器类;

3.3、具体实现

只在一个.cpp里实现,实际项目中建议分成多个文件 

#pragma once

#include <iostream>
#include <unordered_map>
#include <vector>
#include <list>
#include <string>

using namespace std;

//1. 定义迭代器接口
class Iterator
{
public:
	// 下一个
	virtual int getNext() = 0;

	// 是否有下一个
	virtual bool hasMore() = 0;

};

//2. 定义容器接口
class Container
{
public:
	virtual Iterator* create_iterator() = 0;
};


//3. 定义具体迭代器
class ConcreteIterator : public Iterator
{
public:
	// 构造函数,初始化成员变量
	ConcreteIterator(std::vector<int> data) : m_data(data), index(0) {}

	// 下一个
	virtual int getNext() {
		return m_data[index++];
	}

	// 是否有下一个
	virtual bool hasMore() {
		return index < m_data.size();
	}

private:
	std::vector<int> m_data;
	int index;

};

// 4.定义具体容器
class ConcreteContainer : public Container
{
public:
	// 构造函数
	ConcreteContainer(std::vector<int> data) : m_data(data) {}

	// 创建迭代器
	virtual Iterator* create_iterator() {
		return new ConcreteIterator(m_data);
	}

private:
	std::vector<int> m_data;

};

int main()
{
	//1. 创建容器
	std::vector<int> data = { 10, 20, 30, 40, 50 };
	Container* container = new ConcreteContainer(data);
	//2.创建迭代器
	Iterator* iterator = container->create_iterator();

	//3. 迭代器输出
	while (iterator->hasMore()) {
		std::cout << iterator->getNext() << " ";
	}

	// 清除
	delete iterator;
	delete container;
	iterator = nullptr;
	container = nullptr;
	return 0;
}
3.4 运行结果 

4.迭代器模式的优缺点
 

优点:

  •  符合单一职责原则。将遍历行为抽离成单独的类。
  •  符合开闭原则。添加新集合或者新迭代器,不改变原有代码
  • 代码复用性好。由于迭代器模式将遍历集合的代码封装到迭代器中,因此我们可以将同样的迭代器应用于不同的集合对象,从而减少了重复的代码;
  • 可以并行遍历同一集合。 因为每个迭代器对象都包含其自身的遍历状态。

缺点:

  • 若对聚合对象只需要进行简单的遍历行为,那使用迭代器模式有些大材小用。
  • 系统复杂性提高,类数量较多。

5、应用场景

  1. 在遍历集合元素时,不希望暴露集合内部的表示方式和数据结构,而是希望通过统一的接口进行操作。 迭代器模式使得我们可以将遍历行为封装在迭代器对象中,并把迭代器对象作为集合类的成员,从而达到这个目的;
  2. 当需要支持多种遍历方式时,可以使用迭代器模式。例如,在一个列表中,需要实现从前向后和从后向前两种遍历方式,使用迭代器模式非常方便地实现这样的需求;
  3. 需要提供一种通用的遍历机制,使得不同类型的集合对象都可以被遍历。由于迭代器模式将遍历过程封装在迭代器中,因此我们可以为每一种集合对象都提供一个对应的迭代器;
  4. 当需要对集合对象进行复杂的遍历操作时,可以使用迭代器模式。例如,有些集合对象可能需要在遍历过程中进行筛选、排序等处理,这些逻辑可以在迭代器中完成,从而使得客户端代码保持简洁。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【大厂生产案例】JVM调优

写作目的 最近上线了一个需求&#xff0c;遇到了一个JVM报警的问题&#xff0c;很荣幸能遇到&#xff0c;在此分享一下整个调优的过程。 背景 我们是中台服务&#xff0c;我们的甲方就是上游不同的业务。中台原则上是业务和能力分离&#xff0c;但是不可避免的是分不开&…

数据结构学习之路--全面破解顺序表的奥秘(附C源码)

好久不见啊~大家&#xff0c;今天为大家带来的主题是&#xff1a;顺序表的实现。 目录 前言 一、线性表的定义 二、线性表的顺序结构 1 顺序表的定义 2 顺序表的基本操作 2.1 初始化函数 2.2 顺序表的销毁 2.3 顺序表的扩容 2.4 顺序表的尾插 2.5 顺序表的尾删 …

【学习】软件测试需求分析要从哪些方面入手

软件测试需求分析是软件测试过程中非常重要的一个环节&#xff0c;它是为了明确软件测试的目标、范围、资源和时间等要素&#xff0c;以确保软件测试的有效性和全面性。本文将从以下几个方面对软件测试需求分析进行详细的阐述&#xff1a; 一、软件测试目标 软件测试目标是指…

LeetCode_145(二叉树的后序遍历)

1.递归 public List<Integer> postorderTraversal(TreeNode root) {List<Integer> res new ArrayList<>();accessTree(root,res);return res;}public void accessTree(TreeNode root, List<Integer> res){if(root null){return;}accessTree(root.le…

219 基于matlab的汽车悬架(钢板弹簧,减震器)设计程序GUI

基于matlab的汽车悬架&#xff08;钢板弹簧&#xff0c;减震器&#xff09;设计程序&#xff27;&#xff35;&#xff29;。根据需求输入设计参数&#xff0c;包括前桥负荷、簧下质量、弹簧刚度、阻尼等&#xff0c;输出钢板弹簧、减震器结果。程序已调通&#xff0c;可直接运…

FHE全同态加密简介

1. 何为FHE&#xff1f; FHE (Fully homomorphic encryption)&#xff1a; 是一种隐私技术&#xff0c;支持直接对密文进行计算&#xff0c;而无需对密文先解密再计算。即&#xff0c;任何第三方或云厂商&#xff0c;都可对敏感信息的密文进行处理&#xff0c;而无需访问密文内…

基于web的音乐网站的设计与实现(论文+源码)_kaic

摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了音乐网站的开发全过程。通过分析音乐网站管理的不足&#xff0c;创建了一个计算机管理音乐网站的方案。文章介绍了音乐网站的系统分析部分&#xff0c;包括可行性…

最新ChatGPT4.0工具使用教程:GPTs使用,Midjourney绘画,AI换脸,Suno-AI音乐生成大模型一站式系统使用教程

一、前言 ChatGPT3.5、GPT4.0、相信对大家应该不感到陌生吧&#xff1f;简单来说&#xff0c;GPT-4技术比之前的GPT-3.5相对来说更加智能&#xff0c;会根据用户的要求生成多种内容甚至也可以和用户进行创作交流。 然而&#xff0c;GPT-4对普通用户来说都是需要额外付费才可以…

FPGA开源项目分享——基于 DE1-SOC 的 String Art 实现

导语 今天继续康奈尔大学FPGA课程ECE 5760的典型案例分享——基于DE1-SOC的String Art实现。 &#xff08;更多其他案例请参考网站&#xff1a; Final Projects ECE 5760&#xff09; 1. 项目概述 项目网址 ECE 5760 Final Project 项目说明 String Art起源于19世纪的数学…

信息系统项目管理师0044:IT治理方法与标准(3信息系统治理—3.1 IT治理—3.1.4 IT治理方法与标准)

点击查看专栏目录 文章目录 3.1.4 IT治理方法与标准1. ITSS中1T服务治理 3.1.4 IT治理方法与标准 考虑到IT治理对组织战略目标达成的重要性&#xff0c;国内外各类机构持续研究并沉淀IT治理相关的最佳实践方法、定义相关标准&#xff0c;这里面比较典型的是我国信息技术服务标准…

6种xinput1_3.dll丢失的解决办法,并探讨xinput1_3.dll丢失的原因及其属性。

xinput1_3.dll扮演着Visual C运行时库中不可或缺的角色&#xff0c;众多电脑软件都需依赖它以确保正常运行。 当您启动软件时&#xff0c;若遇到xinput1_3.dll无法执行代码的提示&#xff0c;可能会导致软件无法如常启动或运行。本文将向您介绍6种解决方案&#xff0c;并探讨xi…

【Web开发】jquery图片放大镜效果制作变焦镜头图片放大

jquery图片放大镜效果制作变焦镜头图片放大实现 整体步骤流程&#xff1a; 1. 前端html实现 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns"…

vitepress/vite vue3 怎么实现vue模版字符串实时编译

如果是vue模版字符串的话&#xff0c;先解析成模版对象 另一篇文章里有vue模版字符串解析成vue模版对象-CSDN博客 //vue3写法&#xff08;vue2可以用new Vue.extend(vue模版对象)来实现&#xff09;import { createApp, defineComponent } from vue;// 定义一个简单的Vue组件c…

SQLite超详细的编译时选项(十六)

返回&#xff1a;SQLite—系列文章目录 上一篇&#xff1a;SQLite数据库文件格式&#xff08;十五&#xff09; 下一篇&#xff1a;SQLite 在Android安装与定制方案&#xff08;十七&#xff09; 1. 概述 对于大多数目的&#xff0c;SQLite可以使用默认的 编译选项。但是…

elementui树形组件自定义高亮颜色

1、需求描述&#xff1a;点击按钮切换树形的章节&#xff0c;同时高亮 2、代码实现 1&#xff09;style样式添加 <style> .el-tree--highlight-current .el-tree-node.is-current > .el-tree-node__content {background-color: #81d3f8 !important; //高亮颜色colo…

通过pre标签进行json格式化展示,并实现搜索高亮和通过鼠标进行逐个定位的功能

功能说明 实现一个对json进行格式化的功能添加搜索框&#xff0c;回车进行关键词搜索&#xff0c;并对关键词高亮显示搜索到的多个关键词&#xff0c;回车逐一匹配监听json框&#xff0c;如果发生了编辑&#xff0c;需要在退出时提示&#xff0c;在得到用户确认的情况下再退出…

R: 支持向量机(Support Vector Machine,简称SVM)

在数据科学和机器学习领域中&#xff0c;支持向量机&#xff08;Support Vector Machine&#xff0c;简称SVM&#xff09;是一种强大的监督学习算法&#xff0c;常用于分类和回归分析。它的优点之一是可以适用于复杂的数据集&#xff0c;并且在高维空间中表现良好。在本文中&am…

基于java的某超市进销存管理系统

开发语言&#xff1a;Java 框架&#xff1a;ssm 技术&#xff1a;JSP JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclip…

智慧公厕中的大数据、云计算和物联网技术引领未来公厕管理革命

现代社会对于公共卫生和环境保护的要求越来越高&#xff0c;智慧公厕作为城市基础设施建设的重要组成部分&#xff0c;正引领着公厕管理的革命。随着科技的不断进步&#xff0c;大数据、云计算和物联网技术的应用为智慧公厕带来了全新的可能性&#xff0c;&#xff08;ZonTree中…

element-ui的按需引入报错解决:MoudleBuildFailed,完整引入和按需引入

官网&#xff1a; Element - The worlds most popular Vue UI framework 1.完整引入 &#xff08;1&#xff09;下载&#xff1a; npm i element-ui -S &#xff08;2&#xff09;引入&#xff1a; 在 main.js 中写入以下内容&#xff1a; import Vue from vue; impor…