提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。当你需要访问一个聚集对象,而且不管这些对象是什么都需要遍 历的时候,就应该考虑用迭代器模式。同时需要对聚集有多种方式遍历时,可以考虑用迭代器模式。为遍历不同的聚集结构提供如开始、下一个、是否结束、当前哪 一项等统一接口。迭代器模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可让外部代码透明地访问集 合内部的数据。

代码如下:

#include <iostream>
#include <string>
#include <vector> using namespace std; class Iterator
{
public:
Iterator(){};
virtual ~Iterator(){};
virtual string First() = ;
virtual string Next() = ;
virtual string GetCur() = ;
virtual bool IsEnd() = ;
}; class Aggregate
{
public:
virtual int Count() = ;
virtual void Push(const string& strValue)=;
virtual string Pop(const int nIndex)=;
virtual Iterator* CreateIterator() = ;
}; class ConcreteIterator : public Iterator
{
public:
ConcreteIterator(Aggregate* pAggregate):m_nCurrent(),Iterator()
{
m_Aggregate = pAggregate;
}
string First()
{
return m_Aggregate->Pop();
}
string Next()
{
string strRet;
m_nCurrent++;
if(m_nCurrent < m_Aggregate->Count())
{
strRet = m_Aggregate->Pop(m_nCurrent);
}
return strRet;
}
string GetCur()
{
return m_Aggregate->Pop(m_nCurrent);
}
bool IsEnd()
{
return ((m_nCurrent >= m_Aggregate->Count()) ? true: false);
}
private:
Aggregate* m_Aggregate;
int m_nCurrent;
}; class ConcreteAggregate : public Aggregate
{
public:
ConcreteAggregate():m_pIterator(NULL)
{
m_vecItems.clear();
}
~ConcreteAggregate()
{
if(NULL != m_pIterator)
{
delete m_pIterator;
m_pIterator = NULL;
}
}
Iterator* CreateIterator()
{
if(NULL == m_pIterator)
{
m_pIterator = new ConcreteIterator(this);
}
return m_pIterator;
}
int Count()
{
return m_vecItems.size();
}
void Push(const string& strValue)
{
m_vecItems.push_back(strValue);
}
string Pop(const int nIndex)
{
string strRet;
if(nIndex < Count())
{
strRet = m_vecItems[nIndex];
}
return strRet;
}
private:
vector<string> m_vecItems;
Iterator* m_pIterator; };

main 函数

#include "iterator.h"

int main()
{
ConcreteAggregate* pName = NULL;
pName = new ConcreteAggregate();
if(NULL != pName)
{
pName->Push("hello");
pName->Push("word");
pName->Push("cxue");
}
Iterator* iter = NULL;
iter = pName->CreateIterator();
if(NULL != iter)
{
string strItem = iter->First();
while(!iter->IsEnd())
{
cout << iter->GetCur() << " is ok" << endl;
iter->Next();
}
}
system("pause"); return ;
}

最新文章

  1. Session的属性
  2. WaterfallTree(瀑布树) 详细技术分析系列
  3. 自定义Dialog宽度占满屏幕
  4. Cacheable key collision with DefaultKeyGenerator
  5. Scala 深入浅出实战经典 第43讲:主要介绍类型变量bound
  6. VS2013配置Caffe卷积神经网络工具(64位Windows 7)——准备依赖库
  7. 常见http代码错误原因及处理
  8. PCA样本数量少于矩阵维数
  9. Centos7 安装mongodb3.2.9 过程
  10. JSON和XML:不可同日而语
  11. 利用java反射机制 读取配置文件 实现动态类载入以及动态类型转换
  12. 将其它图片格式转为.eps格式
  13. keycode 锁键盘按键(只能输入数字)
  14. java 测试IP
  15. Linux Centos 6.5_x86安装Nginx
  16. C++ Opencv remap()重映射函数详解及使用示例
  17. EntityFramework(1)基础概念与Database First
  18. 2)django-请求生命周期
  19. BZOJ3417[Poi2013]Tales of seafaring——BFS
  20. Java多线程学习(吐血超详细总结)(转)

热门文章

  1. MySQL5.6版本性能调优my.cnf详解
  2. PADS VBA 编写笔记
  3. windows下使用linux命令搜文件
  4. Java类型强制转换
  5. Unit05: JavaScript对象概述 、 常用内置对象一 、 常用内置对象二 、 常用内置对象三
  6. 瞎记录java (含this 的用法)
  7. 操作系统-百科:Linux
  8. line 3: /usr/local/arm/4.3.2/bin/arm-none-linux-gnueabi-gcc: No such file or directory
  9. node 中 npm报错 Error: ENOENT, stat &#39;C:\Users\Administrator\AppData\Roaming\npm&#39;
  10. WARN deprecation:&amp;L - HHH90000012: Recognized obsolete hibernate namespace http://hibernate.sourceforge.net/hibernate-configuration. Use namespace http://www.hibernate.org/dtd/hibernate-configuration