前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >迭代器模式[通俗易懂]

迭代器模式[通俗易懂]

作者头像
全栈程序员站长
发布2022-07-10 11:14:11
2530
发布2022-07-10 11:14:11
举报

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

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

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

应用场景:

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

长处:

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

迭代器模式[通俗易懂]
迭代器模式[通俗易懂]
代码语言:javascript
复制
#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();
       }
};
代码语言:javascript
复制
// 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.cn/115630.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年2月1,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档