我所理解的设计模式(C++实现)——迭代器模式(Iterator Pattern)

2023-11-09

概述:

在现在的电视机中,我们使用[后一个][前一个]按钮可以很方便的换台,当按下[后一个]按钮时,将切换到下一个预置的频道。想象一下在陌生的城市中的旅店中看电视。当改变频道时,重要的不是几频道,而是节目内容。如果对一个频道的节目不感兴趣,那么可以换下一个频道,而不需要知道它是几频道。

这个其实就是我们迭代器模式的精髓:提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示。

类图和实例:

迭代器模式由以下角色组成:

1迭代器角色Iterator):迭代器角色负责定义访问和遍历元素的接口。
2.具体迭代器角色ConcreteIterator):具体迭代器角色要实现迭代器接口,并要记录遍历中的当前位置。
3.集合角色Aggregate):集合角色负责提供创建具体迭代器角色的接口。
4.具体集合角色ConcreteAggregate):具体集合角色实现创建具体迭代器角色的接口——这个具体迭代器角色于该集合的结构相关。

#include <iostream>
#include <vector>
using namespace std;

template<class Item>
class Iterator
{
public:
    virtual void first()=0;
    virtual void next()=0;
    virtual Item* currentItem()=0;
    virtual bool isDone()=0;
    virtual ~Iterator(){}
};

template<class Item>
class ConcreteAggregate;

template<class Item>
class ConcreteIterator : public Iterator <Item>
{
    ConcreteAggregate<Item> * aggr;
    int cur;
public:
    ConcreteIterator(ConcreteAggregate<Item>*a):aggr(a),cur(0){}
    virtual void first()
    {
        cur=0;
    }
    virtual void next()
    {
        if(cur<aggr->getLen())
            cur++;
    }
    virtual Item* currentItem()
    {
        if(cur<aggr->getLen())
            return &(*aggr)[cur];
        else
            return NULL;
    }
    virtual bool isDone()
    {
        return (cur>=aggr->getLen());
    }
};

template<class Item>
class Aggregate
{
public:
    virtual Iterator<Item>* createIterator()=0;
    virtual ~Aggregate(){}
};

template<class Item>
class ConcreteAggregate:public Aggregate<Item>
{
    vector<Item >data;
public:
    ConcreteAggregate()
    {
        data.push_back(1);
        data.push_back(2);
        data.push_back(3);
    }
    virtual Iterator<Item>* createIterator()
    {
        return new ConcreteIterator<Item>(this);
    }
    Item& operator[](int index)
    {
        return data[index];
    }
    int getLen()
    {
        return data.size();
    }
};

int main()
{
    Aggregate<int> * aggr =new ConcreteAggregate<int>();
    Iterator<int> *it=aggr->createIterator();

    for(it->first();!it->isDone();it->next())
    {
        cout<<*(it->currentItem())<<endl;
    }
    delete it;
    delete aggr;
    return 0;
}

实现要点:

1.迭代抽象:访问一个聚合对象的内容而无需暴露它的内部表示。

2.迭代多态:为遍历不同的集合结构提供一个统一的接口,从而支持同样的算法在不同的集合结构上进行操作。

3.迭代器的健壮性考虑:遍历的同时更改迭代器所在的集合结构,会导致问题。

适用性:

1.访问一个聚合对象的内容而无需暴露它的内部表示。

2.支持对聚合对象的多种遍历。

3.为遍历不同的聚合结构提供一个统一的接口(,支持多态迭代)

其他:

1.在C++下可以参看STLiterators的实现。

2.在.NET下实现Iterator模式,对于聚集接口和迭代器接口已经存在了,其中IEnumerator扮演的就是迭代器的角色,而IEnumerable则扮演的就是抽象聚集的角色,她只有一个GetEnumerator()方法,如果集合对象需要具备跌代遍历的功能,就必须实现该接口。

3在Java下可以参看集合类型迭代器(java.util.Iterator,java.util.Enumeration)。


LCL_data原创于CSDN.NET【http://blog.csdn.net/lcl_data/article/details/9310313

其他设计模式请参看:我所理解的设计模式

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我所理解的设计模式(C++实现)——迭代器模式(Iterator Pattern) 的相关文章

  • 将一种类型的对象声明为另一种类型的实例有什么好处? [复制]

    这个问题在这里已经有答案了 可能的重复 Base b2 new Child 是什么意思 表示 https stackoverflow com questions 4447924 what does base b2 new child sig
  • 如何在Java中优雅地处理SIGKILL信号

    当程序收到终止信号时如何处理清理 例如 我连接到一个应用程序 希望任何第三方应用程序 我的应用程序 发送finish注销时的命令 发送该信息最好说什么finish当我的应用程序被破坏时的命令kill 9 编辑1 kill 9无法被捕获 谢谢
  • 在 Java 中从 SOAPMessage 获取原始 XML

    我已经在 J AX WS 中设置了 SOAP WebServiceProvider 但我无法弄清楚如何从 SOAPMessage 或任何 Node 对象获取原始 XML 下面是我现在获得的代码示例 以及我试图获取 XML 的位置 WebSe
  • 项目缺少所需的注释处理库

    我的 Eclipse IDE 突然在问题视图中显示 xxxx 项目缺少所需的注释处理库 xxxx M2 REPO 中的一些旧 jar 我用谷歌搜索 没有找到任何答案 为什么我的项目使用旧的 jar 以及错误来自哪里 To remove th
  • javax.persistence.RollbackException:提交事务时出错],根本原因是 java.lang.StackOverflowError:null

    我有一个使用 Spring Data REST 框架的 Spring Boot API 从 spring boot starter parent 2 1 0 RELEASE 继承的依赖项 我正在尝试执行 PUT 或 PATCH 请求来更新实
  • 如何为小程序提供对文件系统写入的访问权限

    我在设置小程序的策略文件时遇到问题 我是第一次这样做 不知道如何在java中设置小程序的策略文件 实际上我想授予小程序在文件系统上写入的权限 为此我必须向小程序授予文件权限 所以我创建了一个名为 java policy 的文件 并将以下代码
  • Android WebView文件上传

    我正在开发一个 Android 应用程序 基本上它是一个WebView和一个进度条 Facebook 的移动网站 m facebook com 已加载到WebView 当我单击 选择文件 按钮上传图像时 没有任何反应 我已经尝试了所有的解决
  • Kafka Java Consumer 已关闭

    我刚刚开始使用卡夫卡 我面临着消费者的一个小问题 我用Java写了一个消费者 我收到此异常 IllegalStateException 此消费者已关闭 我在以下行中遇到异常 ConsumerRecords
  • 在 Java 中创建 T 的新实例

    在C 中 我们可以定义一个泛型class A
  • Android volley使用RequestFuture.get()时出现超时异常

    在我的片段中 我尝试使用 TMDB 的开放电影数据库来获取有关 正在播放 电影的详细信息 如果我使用 RequestFuture get time TimeUnit 方法来执行此齐射请求 我总是会收到超时错误 如果我在 Safari 中手动
  • LocalDate 减去 period 得到错误的结果

    LocalDate减去一个Period 如 28年1个月27天 得到错误的结果 但减去一个Period 只有天单位 如 10282 天 得到正确的结果 有什么需要注意的吗 public static void main String arg
  • Java 中的 ExecuteUpdate sql 语句不起作用

    我正在学习如何将 SQL 与 Java 结合使用 我已成功安装 JDBC 驱动程序 并且能够从数据库读取记录并将其打印在屏幕上 我的问题发生在尝试执行更新或插入语句时 没有任何反应 这是我的代码 问题所在的方法 public static
  • 从 HttpClient 3 转换为 4

    我已经成功地对所有内容进行了更改 但以下内容除外 HttpClient client HttpPost method client new DefaultHttpClient method new HttpPost url InputStr
  • Jetty Plugin 9启动不喜欢icu4j-2.6.1.jar

    我对 mortbay 的 Maven jetty 插件 6 有相同的配置
  • JAXB 编组器无参数默认构造函数

    我想从 java 库中编组一个 java 对象 当使用 JAXB marschaller 编组 java 对象时 我遇到了一个问题 A 类没有无参数默认构造函数 我使用Java Decompiler来检查类的实现 它是这样的 public
  • Java和手动执行finalize

    如果我打电话finalize 在我的程序代码中的一个对象上 JVM当垃圾收集器处理这个对象时仍然再次运行该方法吗 这是一个大概的例子 MyObject m new MyObject m finalize m null System gc 是
  • Android项目中使用java获取电脑的IP地址

    我在用ksoap2 android http code google com p ksoap2 android 我需要使用java获取IP地址 这样我就不必每次都手动输入它 我所说的 IP 地址是指 例如 如果我这样做ipconfig使用命
  • 在 Freemarker 模板中检查 Spring 安全角色和记录的用户名

    有谁知道 freemarker 标签来检查 freemarker 文件中的 spring 安全角色和用户名 我从网络上的几个资源中发现以下代码将打印登录的用户名 但它没有打印用户名 而是打印 登录为
  • 你能快速告诉我这个伪代码是否有意义吗?

    我相信我的代码现在是万无一失的 我现在将写出伪代码 但我确实有一个问题 为什么 DRJava 要求我返回 if 语句之外的内容 正如你所看到的 我为 ex 写了 return 1 只是因为它问了 但是它永远不会返回该值 谁可以给我解释一下这
  • 使用 AmazonSNSClient 发送短信时的授权

    aws 官方文档如何发送短信 http docs aws amazon com sns latest dg sms publish to phone html使用 java 中的 aws SDK 非常简单 但是 当发送如底部示例所示的消息时

随机推荐

  • memset和memcpy函数

    memset函数 原型 void memset void s int ch size t n 作用 将s所指向的内存中的前n个字节的内容全部设置为ch指定的ASCII值 这个函数通常为新申请的内存做初始化工作 一般用于结构体和数组的初始化
  • 如何用eachart来做一个全国地图撒点的效果

  • Thinkphp5.1开发钉钉应用:企业免登陆_移动端demo

    config gt base php
  • Python的应用场景及优越性能

    你是否正在寻找一种能够在各种应用场景中广泛应用的编程语言 你是否希望能够使用一种易学易用 功能丰富 生态系统完善的语言进行开发工作 那么 Python就是你的不二选择 Python已成为广大开发者和企业的首选编程语言之一 其在各个领域的应用
  • Android下拉刷新完全解析,教你如何一分钟实现下拉刷新功能

    转载请注明出处 http blog csdn net guolin blog article details 9255575 最近项目中需要用到ListView下拉刷新的功能 一开始想图省事 在网上直接找一个现成的 可是尝试了网上多个版本的
  • 我第一次面试自动化测试就被diss了,人生惨遭滑铁卢…

    如果你恰好刚刚进入一家新公司 领导一上来就让你开展自动化测试 作为一名初出茅庐的测试新人 除了手足无措 你只能默默慨叹自己能力尚欠 眼前只会出现一个又一个无从下手的问题 作为手工测试 如何营造机会和环境解决我们自身提升的瓶颈 好慌 以为自己
  • 广州面试题------万欣科技

    部分答案 4 Unchecked Exception 指得是程序的逻辑错误 程序的疵瑕 并且运行的时候无法恢复 包括Error以及RuntimeException及其子类 如 OutOfMemoryError Checked Excepti
  • 【计算机毕业设计】基于微信小程序的校园生活服务系统 校园生活微信小程序

    毕设帮助 技术解答 源码交流 联系方式见文末 一 系统概述 智慧校园建设近年来发展迅猛 校园生活也是社会生活的一部分 完善校园生活线上产品是便利师生生活的必然趋势 高校也积极上线各类信息化系统代替原本的人工操作 目前很多高等院校的智慧校园系
  • 十四Spark ALS协同过滤java

    API http spark apache org docs 1 6 2 api java index html 机器学习里面包含两个包 org apache spark ml 输入是dataframe sql org apache spa
  • VRF技术

    VRF技术白皮书 1 原理简介 近年来网络VPN技术方兴未艾 日益成为业界关注的焦点 根据VPN实现的技术特点 可以把VPN技术分为以下三类 传统VPN FR和ATM CPE based VPN L2TP和IPSec等 Provider P
  • Unity如何判断对象是否已被Destroy

    熟悉了cocos语法的都知道cc isValid这个api可以判断节点 组件是否可用 是否已被销毁 而Unity中却没有这样的API 往往使用 null来进行判断 那么 null到底如何来判断呢 Part 1 public int numT
  • Python+Requests+Pytest+YAML+Allure实现接口自动化

    本项目实现接口自动化的技术选型 Python Requests Pytest YAML Allure 主要是针对之前开发的一个接口项目来进行学习 通过 Python Requests 来发送和处理HTTP协议的请求接口 使用 Pytest
  • CMW500的基本使用方法之BLE测试

    概述 R S CMW500是罗德与施瓦茨公司继CMU200后推出的新一代的无线通信综合测试仪 本文介绍了如何利用CMW500测试低功耗蓝牙 主要参数有频偏 发射功率和接收灵敏度 测试环境搭建 所需仪器 CMW500 屏蔽箱 射频线若干 串口
  • MySQL 学习笔记之 win10 安装MySQL步骤及遇到问题记录(mysql5.7.32)

    下载 mysql 安装包可以到官网下载 选择合适的版本 安装 下载文件后 解压到想要的安装路径 例如 D mysql install mysql 可以看到解压后的文件中并没有 data 目录和 my ini 文件 其中 data 目录是初始
  • 2023 互联网大厂薪资大比拼!

    最近整理了33家互联网大厂的薪资情况 可以看出来 大部分互联网大厂薪资还是很不错的 腾讯 阿里 美团 百度等大厂平均月薪超过30k 其他互联网大厂平均月薪也都在25k以上 01 02 03 04 05 06 07 08 09 10 11 1
  • 特殊区域标注:使用R语言进行数据分析和可视化

    特殊区域标注 使用R语言进行数据分析和可视化 在数据分析和可视化的过程中 我们经常需要对特定的数据区域进行标注 以便更好地理解和传达数据的含义 而R语言作为一种功能强大的数据分析工具 提供了多种方法来实现这一目的 本文将介绍几种常用的技术和
  • 用python让excel飞起来 pdf_讯飞智能键盘K710 一款无网络实力依然在线的黑科技产品...

    科大讯飞一直在人工智能领域创新有佳 产品不断 前一阵子了解科大讯飞发布一款新的智能硬件 讯飞智能键盘K710 居然是键盘和智能语音的神仙组合 究竟是怎样的黑科技 我迫不及待入手看看 下面 就看看这款主打语音的键盘到底是不是如我所想 从选购键
  • 质量检测

    更多详情请查看原文 质量检测 对一份中国工商企业注册数据库的质量考察 Part1 前言 在当前这个信息泛滥的时代 及时 可靠和尽量精准的数据对我们获取知识 理解现实和解决问题变得越来越关键 这催生了一批面对政商学 产学研各个领域专业数据服务
  • Python_RuntimeError问题的解决

    implement array function method already has a docstring 本人开发使用的是apache2 4 python3 6和django 在配置Apache的时候 内外网同时访问就会报错 只能有一
  • 我所理解的设计模式(C++实现)——迭代器模式(Iterator Pattern)

    概述 在现在的电视机中 我们使用 后一个 和 前一个 按钮可以很方便的换台 当按下 后一个 按钮时 将切换到下一个预置的频道 想象一下在陌生的城市中的旅店中看电视 当改变频道时 重要的不是几频道 而是节目内容 如果对一个频道的节目不感兴趣