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

news2024/10/6 14:26:17

简介

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

描述

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

原理

  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.coloradmin.cn/o/1067057.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

有哪些靠谱的程序员兼职平台?

随着时代需求的增长和程序员人才市场的日益饱和&#xff0c;程序员接私活已经不再是一个新鲜的话题了。不得不说&#xff0c;靠接单赚钱是真的爽&#xff0c;感觉会比正经工资收入更奇妙。 但是&#xff0c;从接单数量、质量&#xff0c;到薪资多少&#xff0c;再到时间安排等…

量化交易是什么意思,量化到底是怎么赚钱的?

能直连交易所&#xff0c;获取完整、实时、准确的数据。必须有交易接口&#xff0c;根据策略指令&#xff0c;实现下单撤单&#xff0c;自动交易&#xff0c;获取账户资金和持仓。渠道要安全正规&#xff0c;不通过第三方中转。有了这几点保障才能安全地开始量化交易 在这个金…

笔试强训Day14Day15

T1&#xff1a;幸运的袋子 链接&#xff1a;幸运的袋子__牛客网 (nowcoder.com) 题目描述&#xff1a; 一个袋子里面有n个球&#xff0c;每个球上面都有一个号码(拥有相同号码的球是无区别的)。如果一个袋子是幸运的当且仅当所有球的号码的和大于所有球的号码的积。 例如&…

socket简介

套接字&#xff08;Socket&#xff09;实质上就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端&#xff0c;为应用层进程利网络协议交换数据提供了相应机制。套接字出于承上启下的作用&#xff0c;向上连接应用进程&#xf…

【CVE-2023-35843】NocoDB 任意文件读取漏洞

一、漏洞描述 NocoDB 是 Airtable 的开源替代方案&#xff0c;可以“一键”将 MySQL、PostgreSQL、SQL Server、SQLite 和 MariaDB 转换为智能电子表格。此软件存在任意文件读取漏洞。 二、影响范围 NocoDB<0.106.1 三、网络空间搜索引擎搜索 fofa查询 icon_hash"-…

Spring Boot 常用注解大全:每个程序员必备

文章目录 1. SpringBootApplication2. RestController 和 RequestMapping3. Autowired4. Service、Repository 和 Component5. Configuration6. Value7. Qualifier8. ConditionalOnProperty9. Async10. Scheduled11. EnableCaching12. PathVariable 和 RequestParam13. Request…

网络安全_黑客(自学)

想自学网络安全&#xff08;黑客技术&#xff09;首先你得了解什么是网络安全&#xff01;什么是黑客&#xff01;&#xff01;&#xff01; 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队…

代理IP采集数据:挖掘洞察力的关键工具

在当今数字化时代&#xff0c;数据被视为珍贵的资源&#xff0c;对于企业和组织来说&#xff0c;获取准确、有价值的数据是至关重要的。在数据采集的过程中&#xff0c;代理IP&#xff08;Internet Protocol&#xff09;发挥着关键的作用。本文将介绍代理IP在数据采集中的应用&…

大数据之巅:深入分析数据湖架构的优势

文章目录 什么是数据湖&#xff1f;数据湖的优势1. 弹性扩展性2. 多样化的数据3. 原始数据保存4. 成本效益5. 灵活性和创新6. 基于云的部署 数据湖的挑战1. 数据治理2. 查询性能3. 安全性4. 数据发现 结论 &#x1f389;欢迎来到AIGC人工智能专栏~大数据之巅&#xff1a;深入分…

[补题记录] Atcoder Beginner Contest 298(E)

URL&#xff1a;https://atcoder.jp/contests/abc298 目录 E Problem/题意 Thought/思路 Code/代码 E Problem/题意 A、B 轮流投色子&#xff0c;A 投出 [1, P] 点数的概率相等&#xff0c;B投出 [1, Q] 点数的概率相等。 现有 N 个点&#xff0c;初始时&#xff0c;A 位…

docker部署Vaultwarden密码共享管理系统

Vaultwarden是一个开源的密码管理器&#xff0c;它是Bitwarden密码管理器的自托管版本。它提供了类似于Bitwarden的功能&#xff0c;允许用户安全地存储和管理密码、敏感数据和身份信息。 Vaultwarden的主要特点包括&#xff1a; 1. 安全的数据存储&#xff1a;Vaultwarden使…

C++递归函数

在本文中&#xff0c;您将学习创建递归函数。调用自身的函数。 调用自身的函数称为递归函数。并且&#xff0c;这种技术称为递归。 递归在C 中如何工作&#xff1f; void recurse() {... .. ...recurse();... .. ... }int main() {... .. ...recurse();... .. ... } 下图显…

在模拟器上安装magisk实现Charles抓https包(一)

本机环境&#xff1a;win7 64位&#xff0c;Python3.8.10&#xff0c;逍遥模拟器版本9.0.6&#xff0c;安卓版本9&#xff08;手机里的设置-系统-关于平板电脑-Android版本&#xff09;。 首先下载magisk&#xff0c;下载地址为Releases topjohnwu/Magisk GitHub&#xff0c…

Combination Lock

题目描述 新学期开学&#xff0c;您又回到了学校。您需要记住如何操作储物柜上的组合锁。一个组合锁的常见设计如图 1 所示。组合锁有一个圆形刻度表盘&#xff0c;在表盘上&#xff0c;有 40 个编号为从 0 至 39 的刻度&#xff0c;正上方有一个刻度指针。一个组合由这些数字…

ggkegg | 用这个神包玩转kegg数据库吧!~(一)

1写在前面 好久没更了&#xff0c;实在是太忙了&#xff0c;值班真的是根本不不睡觉啊&#xff0c;一忙一整天&#xff0c;忙到怀疑人生。&#x1f62d; 最近看到比较&#x1f525;的就是ggkegg包&#xff0c;感觉使用起来还是有一定难度的。&#x1fae0; 和大家分享一下使用教…

波浪input输入框文字边框动画

一个input输入框的小动画,大家可以按需引入和修改 input的动画表现为,文字提示波浪动画 效果图如下 源码如下 tips: 有不懂的可以在评论区问博主 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name&q…

mac有些软件无法删除,CleanMyMac X 4.14.3轻松帮你解决

作为Mac用户&#xff0c;你会发现mac有些软件无法删除&#xff0c;这会导致不必要的空间浪费&#xff0c;也可能会干扰你的系统稳定性。但是不用担心&#xff0c;小编会告诉你遇到这种情况应该怎么办&#xff1f; mac有些软件无法删除 首先&#xff0c;让我们一起探究一下背后…

轻量级MobileSAM:比FastSAM快4倍,处理一张图像仅需10ms(附源代码)

论文地址&#xff1a;https://arxiv.org/pdf/2306.14289.pdf 代码地址&#xff1a;https://github.com/ChaoningZhang/MobileSAM 一、概要简介 SAM是一种prompt-guided的视觉基础模型&#xff0c;用于从其背景中剪切出感兴趣的对象。自Meta研究团队发布SA项目以来&#xff0c…

​孤网双机并联逆变器下垂控制策略(包括仿真模型,功率计算模块、下垂控制模块、电压电流双环控制模块​)(Simulink仿真)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

土木硕设计院在职转码上岸

一、个人介绍 双非土木硕&#xff0c;98年&#xff0c;目前在北京&#xff0c;职位为前端开发工程师&#xff0c;设计院在职期间自学转码上岸&#x1f33f; 二、背景 本人于19年开始土木研究生生涯&#xff0c;研二期间去地产实习近半年(碧桂园和世茂&#xff0c;这两家的地产…