迭代器模式,提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。
当你需要访问一个聚集对象,而且不管这些对象是什么都需要遍历的时候,就应该考虑用迭代器模式。另外,需要对聚集有多种方式遍历时,可以考虑使用迭代器模式。为遍历不同的聚集结构提供如开始、下一个、是否结束、当前项等统一接口。
迭代器模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可以让外部代码透明地访问集合内部的数据。
#include <iostream>
#include <vector>
using namespace std;
typedef string object; //object为任意数据类型
class AbstractIterator;
class AbstractAggregate;
class RealIterator;
class RealAggregate;
class AbstractIterator //迭代器抽象类
{
public:
virtual object Frist() = 0; //返回迭代器的第一项
virtual object Next() = 0; //返回迭代器的下一项
virtual bool Isdone() = 0; //判断指针是否访问最后一项
virtual object current() = 0; //返回当前项
};
class AbstractAggregate //集合抽象类
{
public:
virtual AbstractIterator* CreateIterator() = 0; //创建迭代器
};
class RealAggregate : public AbstractAggregate //具体集合类
{
vector<object> item; //容器 存放object数据
public:
AbstractIterator* CreateIterator(); //创建迭代器
int size() //返回当前总的数据个数
{
return item.size();
}
object& operator[](int index) //重载运算符 使用[]访问容器中数据
{
return item[index];
}
void addobject(object str) //容器增加数据
{
item.push_back(str);
}
};
class RealIterator : public AbstractIterator //迭代器具体类
{
RealAggregate* m_aggregate; //指针指向集合
int curr; //当前项在迭代器中的位置
public:
RealIterator(RealAggregate* aggregate):m_aggregate(aggregate) //传入aggregate curr初始化
{
curr = 0;
}
object Frist() //返回迭代器的第一项
{
return (*m_aggregate)[0];
}
object Next() //返回迭代器的下一项
{
object temp;
curr++;
if(curr < m_aggregate->size())
{
temp = (*m_aggregate)[curr];
}
return temp;
}
bool Isdone() //判断指针是否访问最后一项
{
return curr >= m_aggregate->size() ? true : false;
}
object current() //返回当前项
{
return (*m_aggregate)[curr];
}
};
AbstractIterator* RealAggregate::CreateIterator()
{
return (new RealIterator(this));
}
int main()
{
RealAggregate *a = new RealAggregate();
a->addobject("小明");
a->addobject("小王");
a->addobject("行李");
a->addobject("老外");
a->addobject("公交内部员工");
a->addobject("小偷");
RealIterator* i = new RealIterator(a);
while(!i->Isdone())
{
cout<<i->current()<<" 请买车票"<<endl;
i->Next();
}
return 0;
}
显示结果:
[hjf@hjf 设计模式]$ ./a.out
小明 请买车票
小王 请买车票
行李 请买车票
老外 请买车票
公交内部员工 请买车票
小偷 请买车票