数据结构_Iterator
目录
状态变化”模式
常常有一些组件在内部具有特定的数据结构,如果让客户程序依赖这些特定的数据结构,将极大地破坏组件的复用。这时候,将这些特定数据结构封装在内部,在外部提供统一的接口,来实现与特定数据结构无关的访问,是一种行之有效的解决方案。 典型模式
- Composite
- Iterator
- Chain of Resposibility
1 Iterator
迭代器的实现, 现在普遍用编译时多态, c++里是重载或者模版, java 里是泛型, python 里是 duck typing. 基于面相对象的实现可能现在是过时的, 但是这个模式的思想还是很重要的, 也是很多语言的基础.
1.1 模式动机
在软件构建过程中,集合对象内部结构常常变化各异。但对于这些集合对象,我们希望在不暴露其内部结构的同时,可以让外部客户代码透明地访问其中包含的元素;同时这种“透明遍历“也为“同一种算法在多种集合对象上进行操作”提供了可能。
使用面向对象技术将这种遍历机制抽象为“迭代器对象”为“应对变化中的集合对象”提供了一种优雅的方式。
1.2 模式定义
提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露(稳定)该对象的内部表示。
1.3 模式示例代码
# include <iostream>
# include <vector>
// 抽象迭代器类:迭代器
class Iterator {
public:
virtual int next() = 0;
virtual bool hasNext() = 0;
};
// 具体迭代器类:具体迭代器
class ConcreteIterator : public Iterator {
public:
ConcreteIterator(const std::vector<int>& data) : data(data), index(0) {}
int next() {
return data[index++];
}
bool hasNext() {
return index < data.size();
}
private:
std::vector<int> data;
int index;
};
// 容器类:容器
class Container {
public:
Iterator* createIterator() {
return new ConcreteIterator(data);
}
void addElement(int element) {
data.push_back(element);
}
private:
std::vector<int> data;
};
int main() {
Container container;
// 添加元素到容器
container.addElement(1);
container.addElement(2);
container.addElement(3);
// 创建迭代器
Iterator* iterator = container.createIterator();
// 遍历容器中的元素
while (iterator->hasNext()) {
std::cout << iterator->next() << std::endl;
}
// 释放内存(可选)
delete iterator;
return 0;
}
2 要点总结
迭代抽象:访问一个聚合对象的内容而无需暴露它的内部表示。
迭代多态:为遍历不同的集合结构提供一个统一的接口,从而支持同样的算法在不同的集合结构上进行操作。
迭代器的健壮性考虑:遍历的同时更改迭代器所在的集合结构, 会导致问题。