迭代器模式(Iterator Pattern)

174 阅读2分钟

意图:提供一种方法顺序访问一个聚合对象中各个元素,而又无需暴露该对象的内部表示。

主要解决的问题:不同的方式来遍历整个整合对象。
何时使用:遍历一个聚合对象。
如何解决:把在元素之间游走的责任交给迭代器,而不是聚合对象。
应用实例:STL中的各种迭代器就是最典型的应用。

优点:

  1. 它支持以不同的方式遍历一个聚合对象。
  2. 迭代器简化了聚合类。
  3. 在同一个聚合上可以有多个遍历。
  4. 在迭代器模式中,增加新的聚合类和迭代器类都很方便,无需修改原有代码。

缺点: 由于迭代器模式将存贮数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,在一定程度上增加了系统的复杂性。

使用场景:

  1. 访问一个聚合对象的内容而无需暴露它的内部表示。
  2. 需要为聚合对象提供多种遍历方式。
  3. 为遍历不同的聚合结构提供一个统一的接口

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

#include<numeric>
#include<algorithm>
#include<iostream>

using namespace std;

typedef int Object;

class Iterator;
class ConcreteIterator;
//聚合抽象类
class Aggregate
{
public: 
	virtual ~Aggregate(){}
	virtual Object GetItem(int idx) = 0;
	virtual int GetSize() = 0;
protected:
	Aggregate(){}
};

//聚合具体类,在具体应用中可以是数组、链表、集合、队列等等。
class ConcreteAggregate:public Aggregate 
{ public: 
	enum {SIZE = 3};
	ConcreteAggregate(){
		std::iota(std::begin(_objs),std::end(_objs),1);
	}
	~ConcreteAggregate(){}
	Object GetItem(int idx){
		if(idx<this->GetSize())
		{
			return _objs[idx];
		}else{
			return -1;
		}
	}
	int GetSize(){
		return SIZE;
	}

private: 
	Object _objs[SIZE];
};

//迭代器抽象类
class Iterator 
{ 
public: 
	virtual ~Iterator(){}
	virtual void First() = 0;
	virtual void Next() = 0;
	virtual bool IsDone() = 0;
	virtual Object CurrentItem() = 0;
protected: 
	Iterator(){}
};

//迭代器具体类,关联到具体聚合类的迭代器,不同的聚合类有不同的迭代器类实现
class ConcreteIterator:public Iterator 
{ 
public: 
	ConcreteIterator(Aggregate* ag , int idx = 0):_ag(ag),_idx(idx){}
	~ConcreteIterator(){}
	void First(){
		_idx=0;
	}
	void Next(){
		++_idx;
	}
	bool IsDone(){
		return _idx==_ag->GetSize();
	}
	Object CurrentItem(){
		return _ag->GetItem(_idx);
	}

private: 
	Aggregate* _ag;
	int _idx;
};

int main()
{
	Aggregate* ag=new ConcreteAggregate();//聚合类
	Iterator* it=new ConcreteIterator(ag);	//建立聚合类对应得迭代器
	for(;!it->IsDone();it->Next())
	{
		cout<<it->CurrentItem()<<endl;
	}

	return 0;
}

可关注微信公众号,好好学习,天天向上!