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; }