首页 > 代码库 > 迭代器模式
迭代器模式
迭代器模式,提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。
迭代器模式为遍历不同的聚集结构提供如开始、下一个、是否结束、当前哪一项等统一的接口。
应用场景:
- 当你需要访问一个聚集对象,而且不管这些对象是什么都要遍历一遍的时候,你就应该考虑使用迭代器模式。
- 当你需要对聚集对象有多种遍历时,可以考虑使用迭代器模式。
优点:
迭代器模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合内部结构,又可让外部代码透明的访问集合内部的数据。
#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; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。