Iterator(迭代器)設計模式
阿新 • • 發佈:2019-01-25
宣告:本博文篇幅短,適合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、遍歷時不可以刪除或者增加資料物件。