您的位置:首页 > 编程语言 > C语言/C++

Iterator(迭代器)设计模式

2015-12-13 20:22 369 查看
声明:本博文篇幅短,适合review。

一、概念

       提供一种方法访问一个容器对象中的各个元素,而又不暴露该对象的内部细节。

二、模式结构图



三、例子

template<class Item>
class Iterator
{
public:
virtual void first()=0;
virtual void next()=0;
virtual Item* currentItem()=0;
virtual bool isDone()=0;
virtual ~Iterator(){}
};

template<class Item>
class ConcreteIterator : public Iterator <Item>
{
private:
ConcreteAggregate<Item> * aggr;
int cur;
public:
ConcreteIterator(ConcreteAggregate<Item>* a):aggr(a),cur(0){}
void first()
{
cur = 0;
}
void next()
{
if(cur < aggr->getSize())
cur++;
}
Item currentItem()
{
if(cur < aggr->getSize())
return (*aggr)[cur];
else
return NULL;
}
bool isDone()
{
return (cur >= aggr->getSize());
}
};

template<class Item>
class Aggregate
{
public:
virtual Iterator<Item>* createIterator()=0;
virtual ~Aggregate(){}
};

template<class Item>
class ConcreteAggregate : public Aggregate<Item>
{
private:
vector<Item> data;
public:
ConcreteAggregate()
{
data.push_back(1);
data.push_back(2);
data.push_back(3);
}
Iterator<Item>* createIterator()
{
return new ConcreteIterator<Item>(this);
}
Item& operator[](int index)
{
return data[index];
}
int getSize()
{
return data.size();
}
};

void main()
{
Aggregate<int> * aggr = new ConcreteAggregate<int>();
Iterator<int> * it = aggr->createIterator();

for(it->first(); !it->isDone(); it->next())
{
cout<<it->currentItem()<<endl;
}
delete it;
delete aggr;
}
四、优缺点

       1、优点

             a、隐藏容器的实现细节。

             b、可以为容器或其子容器实现不同的迭代方法或多个迭代方法。

             c、支持多态迭代。

       2、缺点

             a、遍历时不可以删除或者增加数据对象。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息