迭代器模式
定义:
提供一个方法顺心访问一个聚合对象中各个元素,而又不需要暴露该对象的内部表示。
适用性:
1、 访问一个聚合对象的内容而无需暴露它的内部表示。
2、 支持聚合对象的多种遍历
3、 为遍历不同的聚合结构提供一个统一的接口。
迭代器的作用:
1、 支持以不同的方式遍历一个聚合。
2、 迭代器简化了聚合的接口
3、 在同一个聚合上可以有多个遍历。
结构:
实现:
template<class Item>
class Iterator
{
public:
virtual void First() = 0;
virtual void Next() = 0;
virtual bool isDone() = 0;
virtualItem CurrentItem() = 0;
};
template<class Item>
class Agrregate
{
public:
virtualIterator<Item>* CreateIterator() = 0;
virtual~Agrregate() {}
};
template<class Item>
class ConcreteIterator;
template<class Item>
class ConcreteAgrregate:public Agrregate<Item>
{
public:
ConcreteAgrregate(){}
~ConcreteAgrregate(){}
Iterator<Item>* CreateIterator()
{
returnnew ConcreteIterator<Item>(this);
}
voidAddItem(Item val)
{
m_itemVec.push_back(val);
}
int Size()
{
returnm_itemVec.size();
}
voidRemoveItem(Item val)
{
vector<Item>::iterator it =find(m_itemVec.begin(),m_itemVec.end(),val);
if(it != m_itemVec.end())
{
m_itemVec.erase(it);
}
}
Item& operator[](int index)
{
returnm_itemVec[index];
}
private:
vector<Item> m_itemVec;
};
template<class Item>
class ConcreteIterator:public Iterator<Item>
{
public:
ConcreteIterator(ConcreteAgrregate<Item>*pAggregate):m_Aggregate(*pAggregate),m_curIndex(0)
{ }
void First()
{
m_curIndex = 0;
}
void Next()
{
if (m_curIndex< m_Aggregate.Size() - 1)
{
++m_curIndex;
}
}
bool isDone()
{
if (m_curIndex== m_Aggregate.Size() - 1)
{
return true;
}
return false;
}
Item CurrentItem()
{
if (m_curIndex< m_Aggregate.Size())
{
returnm_Aggregate[m_curIndex];
}
}
private:
long m_curIndex;
ConcreteAgrregate<Item> m_Aggregate;
};
ConcreteAgrregate<int> *pa = new ConcreteAgrregate<int>();
pa->AddItem(5);
pa->AddItem(15);
pa->AddItem(54);
pa->AddItem(65);
pa->AddItem(57);
pa->AddItem(59);
pa->AddItem(50);
cout<<"pasize :"<<pa->Size()<<endl;
Iterator<int>*pit = pa->CreateIterator();
for(pit->First(); !pit->isDone(); pit->Next() )
{
cout<<pit->CurrentItem()<<" ";
}
cout<<endl;