迭代器模式[通俗易懂]

迭代器模式

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

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

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


应用场景:

  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


相关推荐

  • 高斯伽马分布

    高斯伽马分布定义对于一组随机变量 X T 如果 T Gamma X T N 1 T 那么我们称 X T 满足高斯伽马分布 记为 X T NormalGamma 概率密度函数性质高斯伽马分布是不知道均值和精度的时候 高斯分布的共轭先验概率统计笔记 共轭分布 UQI LIUWJ 的博客 CSDN 博客 统计共轭

    2026年3月16日
    2
  • Flash cookie — 本地共享对象(LOCAL SHARED OBJECTS)

    Flash cookie — 本地共享对象(LOCAL SHARED OBJECTS)写道本地共享对象(有时也称为“Flashcookie”)是一些可由您访问的站点在您的计算机上创建的数据文件。共享对象大多数情况下用来增强您浏览Web的体验。网站可以在您的计算机上编写cookie,当您下次访问该网站时,它将加载该cookie及其信息,从而使您拥有一种更加个性化的体验。例如,您可能让站点记住您的登录名。该信息存储在cookie中,并在您下次访问时被检索…

    2022年7月15日
    14
  • vuecli安装成功但无法运行_vue cli service

    vuecli安装成功但无法运行_vue cli service1.依赖node所以先安装node,可从官网下载安装,安装一直下一步最后选安装目录2.win+r输入cmd运行,先输入node-v和npm-v查看node安装是否正常(我这里node是10.5.0npm是6.1.0)3.安装vue,npm安装过慢且成功率较低,建议使用cnpm安装3.1npm安装方法,npminstallvue(安装成功请到第4步)…

    2022年10月9日
    6
  • CentOS7查看和关闭防火墙

    CentOS7.0默认使用的是firewall作为防火墙查看防火墙状态firewall-cmd–state停止firewallsystemctlstopfirewalld.service禁止firewall开机启动systemctldisablefirewalld.service转自:CentOS6和CentOS7防火墙的关闭关闭se…

    2022年4月4日
    45
  • java 堆栈信息分析_Java堆栈信息分析

    java 堆栈信息分析_Java堆栈信息分析以下数据使用 Jconsole 转储文件中得来 不同的工具 不同的虚拟机得到的具体信息可能有差别栈转储信息转储方式通过 Jconsole 工具 或者其他分析工具 SignalDispat 4daemonprio 9os prio 2tid 0x142b7400ni 0x280runnabl 0x00000000 java lang Thread State RUNNA

    2026年3月16日
    1
  • python中如何把string 转换成int

    python中如何把string 转换成int用数字字符串初始化int类,就可以将整数字符串(str)转换成整数(int):In[1]:int(‘1234’)Out[1]:1234相反用整数初始化str类,就可以将整数(int)转换为对应的字符串(str):In[2]:str(1234)Out[2]:‘1234’如果字符串是浮点数,可以用字符串初始化float类,把浮点数字符串(str)转换成浮点数(float):In[3

    2025年7月22日
    3

发表回复

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

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