定义:提供一种方法访问一个容器对象中各个元素,而又不暴露该对象的内部细节。
类图:
迭代器模式的结构
- 抽象容器:一般是一个接口,提供一个iterator()方法,
- 具体容器:就是抽象容器的具体实现类,
- 抽象迭代器:定义遍历元素所需要的方法,一般来说会有这么三个方法:取得第一个元素的方法first(),取得下一个元素的方法next(),判断是否遍历结束的方法isDone()(或者叫hasNext()),移出当前对象的方法remove(),
- 迭代器实现:实现迭代器接口中定义的方法,完成集合的迭代。
迭代器模式的优缺点
迭代器模式的优点有:
- 简化了遍历方式,对于对象集合的遍历,还是比较麻烦的,对于数组或者有序列表,我们尚可以通过游标来取得,但用户需要在对集合了解很清楚的前提下,自行遍历对象,但是对于hash表来说,用户遍历起来就比较麻烦了。而引入了迭代器方法后,用户用起来就简单的多了。
- 可以提供多种遍历方式,比如说对有序列表,我们可以根据需要提供正序遍历,倒序遍历两种迭代器,用户用起来只需要得到我们实现好的迭代器,就可以方便的对集合进行遍历了。
- 封装性良好,用户只需要得到迭代器就可以遍历,而对于遍历算法则不用去关心。
迭代器模式的缺点:
- 对于比较简单的遍历(像数组或者有序列表),使用迭代器方式遍历较为繁琐,大家可能都有感觉,像List,我们宁可愿意使用for循环和get方法来遍历集合。
typedef int object;
class Iterator
{
public:
virtual object begin() = 0;
virtual void next() = 0;
virtual object end() = 0;
virtual object current() = 0;
virtual bool IsDone() = 0;
};
class ConcreteAggregate
{
private:
vector<object> _objects;
public:
void AddObject(object obj)
{
_objects.push_back(obj);
}
object& operator[](int index)
{
return _objects[index];
}
int size()
{
return _objects.size();
}
};
class ConcreteIterator : public Iterator
{
public:
ConcreteAggregate *agg;
int _index;
public:
ConcreteIterator(ConcreteAggregate *agg)
{
this->agg = agg;
_index = 0;
}
virtual object begin()
{
return (*agg)[0];
}
virtual void next()
{
_index++;
}
virtual object end()
{
_index = agg->size();
return (*agg)[_index];
}
virtual object current()
{
return (*agg)[_index];
}
virtual bool IsDone()
{
return (_index == agg->size());
}
};
int main()
{
cout<<"\n--------------start of the main()---------------"<<endl;
ConcreteAggregate *objects =new ConcreteAggregate();
object a = 1;
object b = 2;
object c = 3;
objects->AddObject(a);
objects->AddObject(b);
objects->AddObject(c);
ConcreteIterator *iter = new ConcreteIterator(objects);
object tmp_begin = iter->begin();
while(!iter->IsDone())
{
cout<<iter->current()<<" ";
iter->next();
}
delete objects;
objects = NULL;
delete iter;
iter = NULL;
cout<<"\n--------------end of the main()---------------"<<endl;
return 0;
}