行为模式9-迭代器模式
迭代器模式 Iterator
意图
提供一方法顺序访问一个聚合对象中各个元素,而又不需要暴露该对象的内部表示。
问题思考
二叉树的先序、中序、后序遍历
适用性
- 访问一个聚合对象的内容而无需暴露它的内部表示。
- 支持对聚合对象的多重遍历。
- 为遍历不同的聚合结构提供一个统一的接口(即,支持多态迭代)
效果
- 它支持以不同的方式遍历一个聚合
- 迭代器简化了聚合的接口
类图
iterator实现
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是调用的new,c++下,要注意内存的释放。有一种方式是放到shared_ptr中。
网友评论