在C++中实现迭代器模式,你需要创建一个迭代器接口,以及一个或多个具体的迭代器类来实现该接口。此外,还需要一个聚合类,它包含了元素集合以及创建迭代器的方法。迭代器模式使得客户端能够遍历或访问聚合对象中的元素,而无需暴露其内部表示。
下面是一个简单的示例,说明如何在C++中实现迭代器模式:
首先,定义一个迭代器接口(Iterator)和聚合接口(Aggregate),以及具体的迭代器和聚合类。
#include <vector>
#include <iostream>
// 迭代器接口
template<typename T>
class Iterator {
public:
virtual bool hasNext() = 0;
virtual T next() = 0;
};
// 聚合接口
template<typename T>
class Aggregate {
public:
virtual Iterator<T>* createIterator() = 0;
};
// 具体聚合类
template<typename T>
class ConcreteAggregate : public Aggregate<T> {
private:
std::vector<T> items;
public:
int getSize() const {
return items.size();
}
void addItem(T item) {
items.push_back(item);
}
T getItem(int index) const {
return items.at(index);
}
Iterator<T>* createIterator() override;
};
// 具体迭代器类
template<typename T>
class ConcreteIterator : public Iterator<T> {
private:
const ConcreteAggregate<T>* aggregate;
int index;
public:
ConcreteIterator(const ConcreteAggregate<T>* aggregate) : aggregate(aggregate), index(0) {}
bool hasNext() override {
return index < aggregate->getSize();
}
T next() override {
return aggregate->getItem(index++);
}
};
// 为ConcreteAggregate定义createIterator
template<typename T>
Iterator<T>* ConcreteAggregate<T>::createIterator() {
return new ConcreteIterator<T>(this);
}
// 使用示例
int main() {
ConcreteAggregate<int> aggregate;
aggregate.addItem(1);
aggregate.addItem(2);
aggregate.addItem(3);
Iterator<int>* iterator = aggregate.createIterator();
while (iterator->hasNext()) {
std::cout << iterator->next() << std::endl;
}
delete iterator;
return 0;
}
在这个示例中,Iterator
是一个模板接口,定义了hasNext
和next
方法。Aggregate
是另一个模板接口,声明了createIterator
方法。ConcreteAggregate
是一个具体的聚合类,它包含了一个元素集合,并实现了createIterator
方法,该方法返回一个ConcreteIterator
实例。ConcreteIterator
是一个具体的迭代器类,它实现了迭代器接口,并能够遍历ConcreteAggregate
中的元素。
通过这种方式,客户端代码可以通过迭代器接口遍历聚合对象中的元素,而不需要知道聚合对象的内部结构。这提高了代码的抽象级别和可重用性。