迭代器模式:提供一種方法順序訪問聚合對象中的各個元素,而無需暴露該對象的內部表示。
first(), next(), currentItem(), isDone())。createIterator()。operator[], getLen())。forEach(callback)),耦合緊密,難以並發遍歷。template
class Iterator {
public:
virtual void first() = 0;
virtual void next() = 0;
virtual Item* currentItem() = 0;
virtual bool isDone() = 0;
virtual ~Iterator() {}
};
template
class ConcreteAggregate;
template
class ConcreteIterator : public Iterator- {
ConcreteAggregate
- * aggr;
int cur;
public:
ConcreteIterator(ConcreteAggregate
- * a) : aggr(a), cur(0) {}
void first() override { cur = 0; }
void next() override { if (cur < aggr->getLen()) cur++; }
Item* currentItem() override { return (cur < aggr->getLen()) ? &(*aggr)[cur] : nullptr; }
bool isDone() override { return cur >= aggr->getLen(); }
};
template
class Aggregate {
public:
virtual Iterator- * createIterator() = 0;
virtual ~Aggregate() {}
};
template
class ConcreteAggregate : public Aggregate- {
vector
- data;
public:
ConcreteAggregate() { data = {1, 2, 3}; }
Iterator
- * createIterator() override { return new ConcreteIterator
- (this); }
Item& operator[](int index) { return data[index]; }
int getLen() { return data.size(); }
};
// 使用
Aggregate
* aggr = new ConcreteAggregate();
Iterator* it = aggr->createIterator();
for (it->first(); !it->isDone(); it->next())
cout << *(it->currentItem()) << endl;