本文章属于专栏- 概述 - 《设计模式(极简c++版)》-CSDN博客
模式说明
- 方案: 迭代器模式是一种行为型设计模式,它提供了一种方法来顺序访问一个容器对象中的各个元素,而不暴露该对象的内部表示。该模式通过引入迭代器对象来封装访问顺序,并让容器对象可以独立于其遍历算法进行变化。
- 优点:
- 将遍历算法和容器对象解耦,使得容器可以自由变化而不影响遍历操作。
- 简化了容器的接口,使得容器只需关注自身的数据结构和操作。
- 缺点:
- 增加了迭代器对象的额外开销。
- 对于某些简单的容器,引入迭代器模式可能会显得过于复杂。
本质思想:将对容器的遍历操作封装到迭代器对象中,使得遍历操作可以独立于容器实现。这样,容器可以改变其内部结构而不影响遍历操作。
实践建议:c++以及大部分语言中,都有自己封装好的第三方迭代器。如std::vector,业务代码一般不需要单独封装,而是把基类指针放到容器中,就可以实现去除实现细节的遍历。
代码示例
cpp
#include <iostream>
#include <vector>
// 迭代器接口
class Iterator {
public:
virtual int next() = 0;
virtual bool hasNext() = 0;
};
// 容器接口
class Container {
public:
virtual Iterator* getIterator() = 0;
virtual void add(int element) = 0;
};
// 具体迭代器
class ConcreteIterator : public Iterator {
private:
std::vector<int>& data;
size_t index;
public:
ConcreteIterator(std::vector<int>& container) : data(container), index(0) {}
int next() override {
return data[index++];
}
bool hasNext() override {
return index < data.size();
}
};
// 具体容器
class ConcreteContainer : public Container {
private:
std::vector<int> data;
public:
Iterator* getIterator() override {
return new ConcreteIterator(data);
}
void add(int element) override {
data.push_back(element);
}
};
int main() {
ConcreteContainer container;
container.add(1);
container.add(2);
container.add(3);
Iterator* it = container.getIterator();
while (it->hasNext()) {
std::cout << it->next() << " ";
}
std::cout << std::endl;
delete it;
return 0;
}
/*
Output:
1 2 3
*/