迭代器模式(Iterator)
迭代器模式是一种行为型设计模式,提供一种方法来顺序访问一个集合对象中的元素,而无需暴露集合对象的内部表示。迭代器模式使得可以使用统一的接口来遍历不同的数据结构,提高了系统的灵活性和可扩展性。
1. 迭代器模式的结构
迭代器模式包含以下几个主要组件:
- Iterator(迭代器接口): 定义了访问集合元素的接口,包括获取当前元素、移动到下一个元素、检查是否有更多元素等方法。
- ConcreteIterator(具体迭代器): 实现了
Iterator
接口,并维护对具体集合的引用,用于遍历集合中的元素。 - Aggregate(聚合接口): 定义了创建迭代器的接口,通常是一个容器或集合。
- ConcreteAggregate(具体聚合): 实现了
Aggregate
接口,并返回一个具体的迭代器对象。
2. Mermaid 关系图
以下是迭代器模式的类图,用 Mermaid 表示:
classDiagram class Iterator { + first() : void + next() : void + isDone() : bool + currentItem() : Element } class ConcreteIterator { + first() : void + next() : void + isDone() : bool + currentItem() : Element } class Aggregate { + createIterator() : Iterator } class ConcreteAggregate { + createIterator() : Iterator } Iterator <|-- ConcreteIterator Aggregate <|-- ConcreteAggregate ConcreteAggregate --> ConcreteIterator : "创建"
3. 迭代器模式的实现
Iterator 迭代器接口:
template<typename T>
class Iterator {
public:
virtual ~Iterator() = default;
virtual void first() = 0;
virtual void next() = 0;
virtual bool isDone() const = 0;
virtual T currentItem() const = 0;
};
ConcreteIterator 具体迭代器:
template<typename T>
class ConcreteIterator : public Iterator<T> {
private:
ConcreteAggregate<T>* aggregate;
size_t current;
public:
ConcreteIterator(ConcreteAggregate<T>* agg) : aggregate(agg), current(0) {}
void first() override {
current = 0;
}
void next() override {
if (!isDone()) {
++current;
}
}
bool isDone() const override {
return current >= aggregate->size();
}
T currentItem() const override {
return aggregate->get(current);
}
};
Aggregate 聚合接口:
template<typename T>
class Aggregate {
public:
virtual ~Aggregate() = default;
virtual Iterator<T>* createIterator() const = 0;
};
ConcreteAggregate 具体聚合:
template<typename T>
class ConcreteAggregate : public Aggregate<T> {
private:
std::vector<T> items;
public:
void add(const T& item) {
items.push_back(item);
}
T get(size_t index) const {
return items.at(index);
}
size_t size() const {
return items.size();
}
Iterator<T>* createIterator() const override {
return new ConcreteIterator<T>(const_cast<ConcreteAggregate<T>*>(this));
}
};
Client 客户端代码:
int main() {
ConcreteAggregate<int> aggregate;
aggregate.add(1);
aggregate.add(2);
aggregate.add(3);
Iterator<int>* iterator = aggregate.createIterator();
for (iterator->first(); !iterator->isDone(); iterator->next()) {
std::cout << iterator->currentItem() << " ";
}
std::cout << std::endl;
delete iterator;
return 0;
}
4. 使用迭代器模式
在客户端代码中,创建具体聚合对象并向其中添加元素。然后,使用迭代器遍历聚合对象中的元素。通过迭代器,可以在不暴露集合内部实现的情况下顺序访问集合中的元素。
5. 总结
迭代器模式通过提供一种方法来顺序访问集合中的元素,而无需暴露集合对象的内部表示,增强了代码的灵活性和可扩展性。Mermaid 类图展示了迭代器接口、具体迭代器、聚合接口、具体聚合类以及它们之间的关系,帮助理解模式的结构和实现。