当前位置: 首页 > news >正文

C++实现设计模式---迭代器模式 (Iterator)

迭代器模式 (Iterator)

迭代器模式 是一种行为型设计模式,它提供了一种方法,顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。


意图

  • 提供一种方法,可以顺序访问一个容器对象中的元素,而无需暴露其内部实现。
  • 将遍历行为从集合对象中分离出来,使得遍历行为可以独立变化。

使用场景

  1. 需要顺序访问一个聚合对象中的元素
    • 如数组、链表或集合。
  2. 需要支持多种遍历方式
    • 如正序遍历、反序遍历等。
  3. 需要解耦遍历算法和容器实现
    • 容器的内部结构可能经常变化,但不希望影响遍历逻辑。

参与者角色

  1. 迭代器接口 (Iterator)
    • 定义用于访问聚合对象元素的方法。
  2. 具体迭代器 (ConcreteIterator)
    • 实现迭代器接口,提供对聚合对象的具体遍历。
  3. 聚合接口 (Aggregate)
    • 定义创建迭代器的方法。
  4. 具体聚合类 (ConcreteAggregate)
    • 实现聚合接口,提供一个数据集合并创建相应的迭代器。

示例代码

以下代码展示了迭代器模式的实现,用于模拟对一个数字集合的顺序访问。

#include <iostream>
#include <vector>
#include <memory>// 迭代器接口
template <typename T>
class Iterator {
public:virtual ~Iterator() = default;// 获取下一个元素virtual T next() = 0;// 判断是否还有下一个元素virtual bool hasNext() const = 0;
};// 聚合接口
template <typename T>
class Aggregate {
public:virtual ~Aggregate() = default;// 创建迭代器virtual std::unique_ptr<Iterator<T>> createIterator() const = 0;
};// 具体迭代器
template <typename T>
class ConcreteIterator : public Iterator<T> {
private:const std::vector<T>& collection; // 引用聚合对象size_t index;                     // 当前索引public:explicit ConcreteIterator(const std::vector<T>& collection): collection(collection), index(0) {}T next() override {return collection[index++];}bool hasNext() const override {return index < collection.size();}
};// 具体聚合类
template <typename T>
class ConcreteAggregate : public Aggregate<T> {
private:std::vector<T> collection; // 存储元素的集合public:void add(const T& element) {collection.push_back(element);}std::unique_ptr<Iterator<T>> createIterator() const override {return std::make_unique<ConcreteIterator<T>>(collection);}
};// 客户端代码
int main() {// 创建一个具体聚合对象ConcreteAggregate<int> aggregate;aggregate.add(1);aggregate.add(2);aggregate.add(3);aggregate.add(4);aggregate.add(5);// 获取迭代器auto iterator = aggregate.createIterator();// 遍历聚合对象std::cout << "集合中的元素: ";while (iterator->hasNext()) {std::cout << iterator->next() << " ";}std::cout << "
";return 0;
}

代码解析

1. 迭代器接口 (Iterator)
  • 定义了 nexthasNext 方法,用于访问聚合对象中的元素。
  • 子类需要实现这些方法以提供具体的遍历逻辑。
template <typename T>
class Iterator {
public:virtual ~Iterator() = default;virtual T next() = 0;virtual bool hasNext() const = 0;
};
2. 具体迭代器 (ConcreteIterator)
  • 实现了迭代器接口。
  • 使用内部索引 index 记录当前遍历的位置,并提供 nexthasNext 方法。
template <typename T>
class ConcreteIterator : public Iterator<T> {
private:const std::vector<T>& collection;size_t index;
public:explicit ConcreteIterator(const std::vector<T>& collection): collection(collection), index(0) {}T next() override { return collection[index++]; }bool hasNext() const override { return index < collection.size(); }
};
3. 聚合接口 (Aggregate)
  • 定义了 createIterator 方法,用于创建迭代器。
template <typename T>
class Aggregate {
public:virtual ~Aggregate() = default;virtual std::unique_ptr<Iterator<T>> createIterator() const = 0;
};
4. 具体聚合类 (ConcreteAggregate)
  • 存储数据集合,并实现了 createIterator 方法,返回具体的迭代器实例。
template <typename T>
class ConcreteAggregate : public Aggregate<T> {
private:std::vector<T> collection;
public:void add(const T& element) { collection.push_back(element); }std::unique_ptr<Iterator<T>> createIterator() const override {return std::make_unique<ConcreteIterator<T>>(collection);}
};
5. 客户端代码
  • 客户端通过聚合对象获取迭代器,并通过迭代器访问集合中的元素。
int main() {ConcreteAggregate<int> aggregate;aggregate.add(1);aggregate.add(2);aggregate.add(3);auto iterator = aggregate.createIterator();while (iterator->hasNext()) {std::cout << iterator->next() << " ";}
}

优缺点

优点
  1. 统一遍历接口
    • 提供了统一的遍历接口,客户端无需了解容器的具体实现。
  2. 解耦遍历算法和容器实现
    • 容器的内部结构可以改变,而不影响遍历逻辑。
  3. 支持多种遍历方式
    • 可以为同一个容器实现多种迭代器,支持不同的遍历方式。
缺点
  1. 类数量增加
    • 每种容器需要实现对应的迭代器类。
  2. 遍历效率可能降低
    • 相比直接访问容器元素,使用迭代器可能增加额外的开销。

适用场景

  1. 需要顺序访问聚合对象中的元素
    • 如遍历集合、列表或数组。
  2. 需要支持多种遍历方式
    • 希望为容器实现不同的遍历逻辑。
  3. 希望解耦遍历算法和容器实现
    • 通过迭代器封装遍历逻辑,避免依赖容器的内部实现。

总结

迭代器模式通过将遍历逻辑封装到迭代器中,实现了聚合对象与遍历算法的解耦。它特别适用于需要顺序访问容器元素,同时希望支持多种遍历方式的场景。

相关文章:

C++实现设计模式---迭代器模式 (Iterator)

迭代器模式 (Iterator) 迭代器模式 是一种行为型设计模式&#xff0c;它提供了一种方法&#xff0c;顺序访问一个聚合对象中的各个元素&#xff0c;而又不需要暴露该对象的内部表示。 意图 提供一种方法&#xff0c;可以顺序访问一个容器对象中的元素&#xff0c;而无需暴露其…...

海康工业相机的应用部署不是简简单单!?

作者&#xff1a;SkyXZ CSDN&#xff1a;SkyXZ&#xff5e;-CSDN博客 博客园&#xff1a;SkyXZ - 博客园 笔者使用的设备及环境&#xff1a;WSL2-Ubuntu22.04MV-CS016-10UC 不会吧&#xff1f;不会吧&#xff1f;不会还有人拿到海康工业相机还是一脸懵叭&#xff1f;不会还有人…...

Windows电脑安装File Browser与cpolar轻松搭建本地云盘

文章目录 前言1.下载安装File Browser2.启动访问File Browser3.安装cpolar内网穿透3.1 注册账号3.2 下载cpolar客户端3.3 登录cpolar web ui管理界面3.4 创建公网地址 4.固定公网地址访问 前言 无论是个人用户还是企业团队&#xff0c;都希望能够有一个高效、安全的解决方案来…...

mac配置 iTerm2 使用lrzsz与服务器传输文件

mac配置 1. 安装支持rz和sz命令的lrzsz brew install lrzsz2. 下载iterm2-send-zmodem.sh和iterm2-recv-zmodem.sh两个脚本 # 克隆仓库 git clone https://github.com/aikuyun/iterm2-zmodem ~/iterm2-zmodem# 进入到仓库目录 cd ~/iterm2-zmodem# 设置脚本文件可执行权限 c…...

【HBuilderX 中 Git 的使用】

目录&#xff1a; 一&#xff1a;安装必要的版本控制工具二&#xff1a;把Github上的项目克隆到本地三&#xff1a;将本地的项目上传到Github上 一&#xff1a;安装必要的版本控制工具 1️⃣ 安装 TortoiseGit 工具&#xff0c;下载地址&#xff1a;https://tortoisegit.org/do…...

Golang结合MySQL和DuckDB提高查询性能

要在Golang中组合MySQL和DuckDB以提高查询性能&#xff0c;请考虑使用混合查询执行方法。这种方法利用了MySQL强大的事务管理和DuckDB闪电般的分析处理能力。本文介绍如何充分利用两者的方法。 各取所长 用MySQL处理事务&#xff0c;用DuckDB处理分析 MySQL应该处理常规的INS…...

学技术学英语:TCP的三次握手和四次挥手

单词 汉语意思 音标 acknowledge 承认&#xff0c;确认 /əkˈnɒl.ɪdʒ/ acknowledgment 确认&#xff0c;承认 /əkˈnɒl.ɪdʒ.mənt/ duplex 双向的 /ˈdjuː.pleks/ establish 建立 /ɪˈstb.lɪʃ/ handshake 握手&#xff0c;握手协议 /ˈhnd.ʃeɪk…...

xiao esp32 S3播放SD卡wav音频

本文旨在使用xiao esp32 S3 播放SD卡上的音频文件 1 硬件准备 SD卡 2 代码实现 2.1 依赖库 ESP32-audioI2S-master 2.2 代码 #include "Arduino.h" #include "Audio.h" #include "SD.h"// Digital I/O used #define I2S_DOUT 6 #defi…...

Unity中实现伤害跳字效果(简单好抄)

第一步骤安装并导入Dotween插件&#xff08;也可以不用导入之后直接下载我的安装包&#xff09; 官网DOTween - 下载 第二步&#xff1a; 制作跳字预制体 建议把最佳适应打开&#xff0c;这样就不怕数字太大显示不全了。 第三步&#xff1a;创建一个空对象并编写脚本JumpNumbe…...

GaussDB日常维护操作

GaussDB日常维护操作 日常维护检查操作系统参数数据库健康状态日志收集日志清理应用连接数表的例行维护索引重建慢SQL诊断 日常维护检查 实例状态检查&#xff1a; #检查集群实例状态 gs_check -U omm -i CheckClusterStatecm_ctl query -Cvipd#检查主备DN的角色和同步状态 g…...

redis实现限流

令牌桶逻辑 计算逻辑&#xff1a; 代码&#xff1a; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool;/*** ClassName RedisRateLimiterTokenBucket* Description TODO* Author zhang zhengdong* DATE 2025/1/17 20:22* Version 1.0*/ public class…...

基于SpringBoot和PostGIS的各国及所属机场信息检索及可视化实现

目录 前言 一、空间数据简介 1、全球国家信息表 2、机场信息表 3、国家机场检索实现 二、SpringBoot后台实现 1、模型层实现 2、控制层实现 三、WebGIS可视化实现 1、Leaflet界面实现 2、国家及其机场可视化成果 3、全球机场数量排行榜 四、总结 前言 新春佳节即将…...

python http server运行Angular 单页面路由时重定向,解决404问题

问题 当Angular在本地ng server运行时候&#xff0c;可以顺利访问各级路由。 但是运行ng build后&#xff0c;在dist 路径下的打包好的额index.html 必须要在服务器下运行才能加载。 在服务器下我们第一次访问路由页面时是没有问题的&#xff0c;但是尝试刷新页面或手动输入路…...

GPT-4o背后的语音技术

GPT-4o背后的语音技术 GPT-4o是一个any2any的多模态模型,能够接受文本、音频、图像、视频等多模态输入,也能够生成包含文本、语音、图像和视频等混合内容的多模态输出。本文主要谈语音多模态的实现,并分享一些对于语音研究未来发展的看法。 GPT-4o (“o” 代表 “omni”) …...

微透镜阵列精准全检,白光干涉3D自动量测方案提效70%

广泛应用的微透镜阵列 微透镜是一种常见的微光学元件&#xff0c;通过设计微透镜&#xff0c;可对入射光进行扩散、光束整形、光线均分、光学聚焦、集成成像等调制&#xff0c;进而实现许多传统光学元器件难以实现的特殊功能。 微透镜阵列&#xff08;Microlens Array&#x…...

Spring boot框架下的RocketMQ消息中间件

1. RocketMQ 基础概念 1.1 核心概念 以下是 RocketMQ 核心概念在 Spring Boot 的 Java 后端代码中的实际使用方式&#xff1a; Producer&#xff08;生产者&#xff09; 定义&#xff1a;Producer 是负责发送消息到 RocketMQ 的组件。它可以将消息发送到指定的 Topic。 实…...

记录一次 centos 启动失败

文章目录 现场1分析1现场2分析2搜索实际解决过程 现场1 一次断电,导致 之前能正常启动的centos 7.7 起不来了有部分log , 关键信息如下 [1.332724] XFS(sda3): Internal error xfs ... at line xxx of fs/xfs/xfs_trans.c [1.332724] XFS(sda3): Corruption of in-memory data…...

C++学习第五天

创作过程中难免有不足&#xff0c;若您发现本文内容有误&#xff0c;恳请不吝赐教。 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、构造函数 问题1 关于编译器生成的默认成员函数&#xff0c;很多童鞋会有疑惑&#xff1a;不实现构造函数的情况下…...

openharmony标准系统方案之瑞芯微RK3568移植案例

标准系统方案之瑞芯微RK3568移植案例 ​本文章是基于瑞芯微RK3568芯片的DAYU200开发板&#xff0c;进行标准系统相关功能的移植&#xff0c;主要包括产品配置添加&#xff0c;内核启动、升级&#xff0c;音频ADM化&#xff0c;Camera&#xff0c;TP&#xff0c;LCD&#xff0c…...

深入理解 SSH 端口转发:本地 vs 远程 vs 动态转发

&#x1f31f; 简介 SSH 端口转发&#xff08;SSH Port Forwarding&#xff09;作为一种强大而灵活的技术&#xff0c;不仅可以帮助我们安全地访问远程服务&#xff0c;还能轻松突破网络限制。本文将带你深入了解 SSH 端口转发的原理、类型和实战应用。 &#x1f308; 目录 &a…...

测试微信模版消息推送

进入“开发接口管理”--“公众平台测试账号”&#xff0c;无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息&#xff1a; 关注测试号&#xff1a;扫二维码关注测试号。 发送模版消息&#xff1a; import requests da…...

ssc377d修改flash分区大小

1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

(二)原型模式

原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

C# 类和继承(抽象类)

抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)

🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...

今日科技热点速览

&#x1f525; 今日科技热点速览 &#x1f3ae; 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售&#xff0c;主打更强图形性能与沉浸式体验&#xff0c;支持多模态交互&#xff0c;受到全球玩家热捧 。 &#x1f916; 人工智能持续突破 DeepSeek-R1&…...

Spring数据访问模块设计

前面我们已经完成了IoC和web模块的设计&#xff0c;聪明的码友立马就知道了&#xff0c;该到数据访问模块了&#xff0c;要不就这俩玩个6啊&#xff0c;查库势在必行&#xff0c;至此&#xff0c;它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据&#xff08;数据库、No…...

Android第十三次面试总结(四大 组件基础)

Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成&#xff0c;用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机&#xff1a; ​onCreate()​​ ​调用时机​&#xff1a;Activity 首次创建时调用。​…...

IP如何挑?2025年海外专线IP如何购买?

你花了时间和预算买了IP&#xff0c;结果IP质量不佳&#xff0c;项目效率低下不说&#xff0c;还可能带来莫名的网络问题&#xff0c;是不是太闹心了&#xff1f;尤其是在面对海外专线IP时&#xff0c;到底怎么才能买到适合自己的呢&#xff1f;所以&#xff0c;挑IP绝对是个技…...