行為模式9-迭代器模式
迭代器模式 Iterator
意圖
提供一方法順序訪問一個(gè)聚合對(duì)象中各個(gè)元素沸枯,而又不需要暴露該對(duì)象的內(nèi)部表示绑榴。
問題思考
二叉樹的先序盈魁、中序、后序遍歷
適用性
- 訪問一個(gè)聚合對(duì)象的內(nèi)容而無需暴露它的內(nèi)部表示赤套。
- 支持對(duì)聚合對(duì)象的多重遍歷按脚。
- 為遍歷不同的聚合結(jié)構(gòu)提供一個(gè)統(tǒng)一的接口(即,支持多態(tài)迭代)
效果
- 它支持以不同的方式遍歷一個(gè)聚合
- 迭代器簡(jiǎn)化了聚合的接口
類圖
實(shí)現(xiàn)
template<typename Item>
class Iterator {
public:
virtual bool HasNext() = 0;
virtual Item *Next() = 0;
};
class Aggregate {
public:
virtual Iterator *CreateIterator() = 0;
};
template<typename Item>
class ConcreteIterator : public Iterator<Item> {
public:
explicit ConcreteIterator(const std::vector<Item > &vector) {
mItemVec = vector;
}
bool HasNext() override {
return idx <= mItemVec.size() - 1;
}
Item *Next() override {
return mItemVec[idx++];
}
private:
std::vector<Item > mItemVec;
int idx = 0;
};
class ConcreteAggregate : public Aggregate {
public:
Iterator<int> *CreateIterator() override {
return new ConcreteIterator<int>(mDataVector);
}
private:
std::vector<int> mDataVector;
};
注意:注意CreateIterator是調(diào)用的new脖旱,c++下介蛉,要注意內(nèi)存的釋放。有一種方式是放到shared_ptr中践险。