模式特点
提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示。
- 将遍历逻辑从聚合对象中分离出来
- 支持多种遍历方式(前序、中序、后序、BFS、DFS)
- 统一不同容器的遍历接口
- 支持同时多个独立遍历
类图
应用场景
- Qt 中 QList::const_iterator、QMap::iterator 等 STL 风格迭代器
- QTreeWidgetItem 树形结构的递归遍历
- 自定义数据结构(如链表、图、树)的遍历
- 示教器运动轨迹点的顺序访问
- 数据库查询结果集的逐行读取
示例代码(C++)
// 抽象迭代器 template<typename T> class Iterator { public: virtual bool hasNext() = 0; virtual T next() = 0; virtual ~Iterator() = default; }; // 轨迹点集合 class Trajectory { std::vector<std::pair<double, double>> m_points; public: void addPoint(double x, double y) { m_points.push_back({x, y}); } // 内部迭代器 class TrajIterator : public Iterator<std::pair<double,double>> { Trajectory& m_traj; size_t m_idx = 0; public: TrajIterator(Trajectory& t) : m_traj(t) {} bool hasNext() override { return m_idx < m_traj.m_points.size(); } std::pair<double,double> next() override { return m_traj.m_points[m_idx++]; } }; TrajIterator* createIterator() { return new TrajIterator(*this); } }; Trajectory traj; traj.addPoint(0, 0); traj.addPoint(100, 200); traj.addPoint(50, 300); // 使用迭代器遍历,不暴露内部 vector auto* it = traj.createIterator(); while (it->hasNext()) { auto [x, y] = it->next(); std::cout << "点(" << x << "," << y << ")" << std::endl; }