迭代器模式[通俗易懂]

迭代器模式

大家好,又见面了,我是全栈君。

迭代器模式
,提供一种方法顺序訪问一个聚合对象中各个元素,而又不暴露该对象的内部表示。

迭代器模式为遍历不同的聚集结构提供如開始、下一个、是否结束、当前哪一项等统一的接口。


应用场景:

  1. 当你须要訪问一个聚集对象。并且无论这些对象是什么都要遍历一遍的时候,你就应该考虑使用迭代器模式。

  2. 当你须要对聚集对象有多种遍历时。能够考虑使用迭代器模式。
长处:

迭代器模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既能够做到不暴露集合内部结构。又可让外部代码透明的訪问集合内部的数据。

迭代器模式[通俗易懂]

#include "stdafx.h"
#include <iostream>
#include <vector>
using namespace std;

template<typename T >
class Iterator
{
public:
        virtual ~Iterator(){};
        virtual void First() = 0;
        virtual void Next() = 0;
        virtual bool IsDone() const = 0;
        virtual  T* CurrentItem() = 0;
};

template<typename T >
class ConcreteAggregate ;

template<typename T >
class Aggregate
{
public:
        virtual ~Aggregate() {};
        virtual Iterator< T>* CreateIterator() = 0;
};

template<typename T >
class ConcreteIterator :public Iterator <T >
{
private:
        ConcreteAggregate<T >* m_pAggre;
        int current = 0;
public:
        virtual ~ConcreteIterator()
       {
               delete m_pAggre;
       }
       ConcreteIterator( ConcreteAggregate<T >* pAggre ) :m_pAggre(pAggre), current(0)
       {}

        virtual void First()
       {
              current = 0;
       }

        virtual void Next()
       {
               if (current < m_pAggre->GetLen())
                     ++current;
       }

        virtual bool IsDone() const
       {
               return (current >= m_pAggre->GetLen());
       }

        virtual T* CurrentItem()
       {
               if (current <= m_pAggre->GetLen())
                      return &(*m_pAggre)[current];
               else
                      return NULL;
       }

};

template<typename T >
class ConcreteAggregate :public Aggregate <T >
{
private:
        vector< T> m_Data;
public:
       ConcreteAggregate()
       {
              m_Data.push_back(1);
              m_Data.push_back(2);
              m_Data.push_back(3);
       }

        virtual Iterator< T>* CreateIterator()
       {
               return new ConcreteIterator<T >(this );
       }

        T& operator[]( int index)
       {
               return m_Data[ index];
       }

        int GetLen()
       {
               return m_Data.size();
       }
};

// IteratorPattern.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "Iterator.h"
#include <iostream>

int _tmain (int argc , _TCHAR * argv [])
{
        Aggregate< int>* pAgg = new ConcreteAggregate<int >();
        Iterator< int>* it = pAgg->CreateIterator();
        for (it->First(); !it->IsDone(); it->Next())
       {
              std::cout <<*( it->CurrentItem() )<< std::endl;
       }

       getchar();
        return 0;
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/115630.html原文链接:https://javaforall.net

(0)
上一篇 2022年2月1日 下午8:00
下一篇 2022年2月1日 下午9:00


相关推荐

  • python 时间格式(时间戳–格式化时间)的互相转换

    python 时间格式(时间戳–格式化时间)的互相转换

    2021年11月10日
    110
  • iOS逆向:【ARM 移位操作】(LSL、ASL、LSR、ASR、ROR、RRX)

    iOS逆向:【ARM 移位操作】(LSL、ASL、LSR、ASR、ROR、RRX)前言移位操作在 ARM 指令集中不作为单独的命令使用 它在指令格式中是一个字段 1 LSL 逻辑左移 LogicalShift 与 ASL 算术左移 ArithmeticSh 逻辑左移与算术左移的操作是一样的 都是将操作数向左移位 低位补零 移除的高位进行丢弃 MOVR0 5MOVR1 R0 LSL 2 上述命令 就是将 5 存储到 R0 寄存器

    2026年3月19日
    2
  • pycharm如何调整字体大小

    pycharm如何调整字体大小关于 pycharm 如何调整字体大小的问题解决方案 1 打开 PyCharm 单击 File 2 选择 Settings 会打开一个弹窗 3 接着选中弹窗中的 Editor 4 然后 选中 Font 5 然后我们可以看到如图所示的界面 其中红方框里面是显示效果 6 如图 改变红方框标注的 Size 值的大小 就可以调节字体大小了 该篇文章图片及文本全部摘自百度经验 仅供学习参考

    2026年3月27日
    3
  • Pycharm安装包(类库)的方法总结及解决包下载慢的问题

    Pycharm安装包(类库)的方法总结及解决包下载慢的问题1.在编译文本里面当你引用的包没有下载时,pycharm会自动用红色的灯泡来提示,这时,你直接点击红色灯泡,会出现一个下拉框,选择下载包的哪一项,pycharm就会自动下载,你没有安装的包。2.在有建立好的一个工程下:file-&amp;gt;Settings-&amp;gt;Project:(你已经建立好的工程名字)-&amp;gt;在这里面有两个选项,选项一:ProjectInterpreter(工程解释…

    2022年5月17日
    40
  • 什么是同步请求和异步请求?

    什么是同步请求和异步请求?一 同步 异步请求浏览器发送请求给服务器 其有同步请求和异步请求两种方式 1 同步请求什么叫同步请求呢 就是在发送一个请求之后 需要等待服务器响应返回 才能够发送下一个请求 之前学的请求是通过浏览器地址栏发送请求 这种方式就是属于同步请求 但是其有两个缺陷 请求必须要等待响应如果遇到请求阻塞 网络延迟 用户需要等待 这样用户体验效果不好 请求时会携带所有的信息比如说一个 form 表单 需要填入用户名 密码 手机号 等多个信息 如果其中有一个信息填写错了 请求失败 又要全部重新填写 会很

    2026年3月17日
    3
  • idea怎么搭建springboot_你没有创建该项目的权限

    idea怎么搭建springboot_你没有创建该项目的权限一般来说,用IDEA创建SpringBoot项目有两种方式。其一是Spring官网提供了一个快速生成SpringBoot项目的网站,可以在官网直接下载后,再导入IDEA中。另外一种是直接用IDEA创建一个SpringBoot项目,一般开发也是用的这种方式进行创建。虽说SpringBoot简化了Spring的配置,但学习之前需要对Spring基础知识有一定的掌握。……

    2022年10月13日
    6

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号