迭代器模式[通俗易懂]

迭代器模式

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

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

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


应用场景:

  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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • html table样式设计_html设置table中的字体

    html table样式设计_html设置table中的字体table.gridtable{font-family:verdana,arial,sans-serif;font-size:11px;color:#333333;border-width:1px;border-color:#666666;border-collapse:collapse;}table.gridtableth{border-width:1px;padding…

    2022年9月20日
    2
  • LSTM模型理解_rfm模型应用实例

    LSTM模型理解_rfm模型应用实例LSTM模型之前一直想要了解一下LSTM模型的想法,看到一些介绍,说里面的各种门,遗忘门,输入门,输出门,是模拟电路的,然后自己就一直很莫名其妙,怎么还有电路什么的,然后就各种一直看不懂。。。现在回过头来仔细的看了看,发现原来也不是很难。不是电路,跟电路一点关系都没有,把它想象成一个神经元就好了,一切问题迎刃而解。嗯,是的,就是这么简单。。。最后在知乎上找了一篇文章,讲的挺不错的:https:…

    2025年10月20日
    6
  • 国内外手机号码正则表达式

    国内外手机号码正则表达式附上语言(文化)代码与国家地区对照表:国家/地区语言代码国家/地区语言代码:简体中文(中国) zh-cn 繁体中文(台湾地区) zh-tw 繁体中文(香港) zh-hk 英语(香港) en-hk 英语(美国) en-us 英语(英国) en-gb 英语(全球) en-ww 英语(加拿大) en-ca 英语(澳大利亚) en-au 英语(爱尔兰) en-ie 英语(芬兰) en-f

    2022年6月1日
    39
  • Kong插件开发向导

    Kong插件开发向导转载李亚飞大佬的文章:https://www.lyafei.com/简介前面洋洋洒洒写了那么多文章,Kong搭建、Konga搭建、Kong插件开发工具包、Lua算法实现等等,就为了这篇Kong插件开发铺垫,在进一步讨论之前,有必要再简要阐述下Kong是如何构建的,特别是它如何与Nginx集成,以及它与Lua脚本之间的关系。使用lua-nginx-module模块可以在Nginx中启用Lua脚本功能,Kong与OpenResty一起发布,OpenResty中已经包.

    2022年6月26日
    44
  • telnet远程登录AAA认证

    telnet远程登录AAA认证R1<Huawei>system-view//进入全局配置模式[Huawei]sysnameR1//改名[R1]undoinfo-centerenable//关闭信息告警提示[R1]interfaceg0/0/0//进入g/0/0接口[R1-GigabitEthernet0/0/0]ipaddress192.168.100…

    2022年6月7日
    38
  • vue登录判断token过期_vue token过期处理

    vue登录判断token过期_vue token过期处理检查了所有代码都没有问题,在所有需要token的地方都能拿到正确的token,但是在verify时仍然走的err,打印出的错误为invalidtoken最后在外网查到有人在获取token时使用了split,才注意到直接从请求头拿到的token打印出来是带双引号的,而这个双引号也被当做token的一部分进行验证了把头尾的双引号去掉再做验证就成功了…

    2025年11月3日
    7

发表回复

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

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