//Aggregate.h
class Iterator;
typedefint Object;
class Interator;
class Aggregate {
public:
virtual~Aggregate();
virtual Iterator* CreateIterator()= 0;
virtual Object GetItem(int idx)= 0;
virtualint GetSize() = 0;
protected:
Aggregate();
};
class ConcreteAggregate:public Aggregate {
public:
enum {SIZE= 3};
ConcreteAggregate();
~ConcreteAggregate();
Iterator* CreateIterator();
Object GetItem(int idx);
int GetSize();
private: Object _objs[SIZE];
}; |
//Aggregate.cpp #include"Aggregate.h" #include"Iterator.h"
#include<iostream> usingnamespace std;
Aggregate::Aggregate() {
}
Aggregate::~Aggregate() {
}
ConcreteAggregate::ConcreteAggregate() { for (int i= 0; i < SIZE; i++) _objs[i]= i; }
ConcreteAggregate::~ConcreteAggregate() {
}
Iterator* ConcreteAggregate::CreateIterator() {
returnnew ConcreteIterator(this);
}
Object ConcreteAggregate::GetItem(int idx) { if (idx< this->GetSize()) return _objs[idx]; else return-1; }
int ConcreteAggregate::GetSize() { return SIZE; } |
//Iterator.h class Aggregate; typedefint Object;
class Iterator { public: virtual~Iterator();
virtualvoid First() = 0;
virtualvoid Next() = 0;
virtualbool IsDone() =0;
virtual Object CurrentItem()= 0;
protected:
Iterator(); };
class ConcreteIterator:public Iterator {
public:
ConcreteIterator(Aggregate* ag ,int idx =0);
~ConcreteIterator();
void First();
void Next();
bool IsDone();
Object CurrentItem();
private:
Aggregate* _ag; int _idx; }; |
//Iterator.cpp
#include"Iterator.h" #include"Aggregate.h"
#include<iostream> usingnamespace std;
Iterator::Iterator() {
}
Iterator::~Iterator() {
}
ConcreteIterator::ConcreteIterator(Aggregate*ag ,int idx) { this->_ag= ag; this->_idx= idx; }
ConcreteIterator::~ConcreteIterator() {
}
Object ConcreteIterator::CurrentItem() { return _ag->GetItem(_idx); }
void ConcreteIterator::First() { _idx= 0; }
void ConcreteIterator::Next() { if (_idx< _ag->GetSize()) _idx++; }
bool ConcreteIterator::IsDone() { return (_idx== _ag->GetSize()); } |
//main.cpp #include"Iterator.h" #include"Aggregate.h" #include<iostream> usingnamespace std;
int main(int argc,char* argv[]) { Aggregate* ag= new ConcreteAggregate();
Iterator* it= new ConcreteIterator(ag);
for (;!(it->IsDone()) ; it->Next()) { cout<<it->CurrentItem()<<endl; }
return0; } |
代码说明
Iterator模式的实现代码很简单,实际上为了更好地保护 Aggregate的状态,我们可以尽量减小Aggregate的public接口,而通过将Iterator对象声明位Aggregate的友元来给予Iterator一些特权,获得访问 Aggregate 私有数据和方法的机会。
Iterator模式的应用很常见,我们在开发中就经常会用到 STL中预定义好的 Iterator来对STL类进行遍历(Vector、Set等)。