// Iterator.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
using namespace std;
typedef int DATA;
class Iterator;
class Aggregate
{
public:
Aggregate()
{
}
virtual ~Aggregate()
{
}
virtual Iterator* CreateIterator()=0;
virtual int GetSize()=0;
virtual DATA GetItem(int index)=0;
};
class Iterator
{
public:
Iterator()
{}
virtual~ Iterator()
{}
virtual void First()=0;
virtual void Next()=0;
virtual bool IsDone()=0;
virtual DATA CurrentItem()=0;
};
class ConcreteIterator:public Iterator
{
public:
ConcreteIterator(Aggregate* p):m_pConcreteAggregate(p),m_index(0)
{
}
virtual ~ConcreteIterator()
{
}
virtual void First()
{
m_index=0;
}
virtual void Next()
{
if(m_index<m_pConcreteAggregate->GetSize() )
{
m_index++;
}
}
virtual bool IsDone()
{
return m_index==m_pConcreteAggregate->GetSize();
}
virtual DATA CurrentItem()
{
return m_pConcreteAggregate->GetItem(m_index);
}
private:
Aggregate * m_pConcreteAggregate;
int m_index;
};
class ConcreteAggregate:public Aggregate
{
public:
ConcreteAggregate(int size):m_size(size)
{
m_pData=new DATA[m_size];
for(int i=0;i<m_size;i++)
{
m_pData[i]=i;
}
}
virtual ~ ConcreteAggregate()
{
delete []m_pData;
m_pData=NULL;
}
virtual Iterator* CreateIterator()
{
return new ConcreteIterator(this);
}
virtual int GetSize()
{
return m_size;
}
virtual DATA GetItem(int index)
{
if(index<m_size)
{
return m_pData[index];
}
else
{
return -1;
}
}
private:
int m_size;
DATA *m_pData;
};
int _tmain(int argc, _TCHAR* argv[])
{
Aggregate * pAggregate=new ConcreteAggregate(10);
Iterator * pIterator=pAggregate->CreateIterator();
for(;false==pIterator->IsDone();pIterator->Next())
{
cout<<pIterator->CurrentItem()<<endl;
}
return 0;
}