Design Patterns: Iterator mode

Objective: to separate the query, to reduce coupling of data and data stored in the data

Inheritance diagram:

example:

// define iterator interface 
Template <typename T> 
class the Iterator 
{ 
public: 
	Virtual BOOL the hasNext () = 0; 
	Virtual Next T () = 0; 
};
//定义集合的接口
template<typename T> 
class Aggregate
{
public:
	virtual Iterator<T>* createIterator() = 0;
	virtual T getItem(int index) = 0;
	virtual int getSize() = 0;
	virtual void setItem(T t) = 0;
};
//迭代器的具体实现类
template<typename T>
class IteratorImp: public Iterator<T>
{
	Aggregate<T>* p;
	int index;
public:
	IteratorImp(Aggregate<T>* aggregate)
	{
		p = aggregate;
		index = 0;
	}
	
	bool hasNext()
	{
		if(index < p->getSize())
		{
			return true;
		}
		else
		{
			return false;
		}
	}
	
	T next()
	{
		return p->getItem(index++);
	}
};
// set the implementation class 
Template <typename T> 
class AggregateImp: public Aggregate <T> 
{ 
	Vector <T> Data; 
public: 
	the Iterator <T> * createIterator () // this is a critical step, and a set of hooks iterator 
	The set {// initialize the iterator and returns an iterator 
		return new new IteratorImp <T> (the this); 
	} 
	
	T the getItem (int index) 
	{ 
		return Data [index]; 
	} 
	
	int getSize () 
	{ 
		return data.size (); 
	} 
	
	the setItem void (T T) 
	{ 
		data.push_back (T); 
	} 
};
int main() 
{
	Aggregate<int>* d = new AggregateImp<int>();
	Iterator<int>* iterator = d->createIterator();
	
	d->setItem(1);
	d->setItem(3);
	d->setItem(4);
	d->setItem(2);

	while(iterator->hasNext())
	{
		cout << iterator->next() <<endl;
	}
	
	return 0;
}

  

Guess you like

Origin www.cnblogs.com/chusiyong/p/11431340.html