一、迭代器模式是什么?
迭代器模式是一种行为型的软件设计模式,提供一种方法能顺序访问聚合对象中的各个元素,而又不暴露其内部。
我们使用的聚合对象各种各样,比如vector、list、tree、map等等,既然是聚合,那就有访问其个体的需要。而遍历访问这个行为可能有深度优先、广度优先、顺序遍历、逆序遍历等等,迭代器的意义就是将这个行为抽离封装起来,这样客户端只需要调用合适的迭代器,来进行对应的遍历,而不用自己去实现这一行为。
迭代器模式的优点:
- 符合单一职责原则。将遍历行为抽离成单独的类。
- 符合开闭原则。添加新集合或者新迭代器,不改变原有代码。
- 便于扩展多种遍历行为。
- 访问数据又不暴露内部。
迭代器模式的缺点:
- 若对聚合对象只需要进行简单的遍历行为,那使用迭代器模式有些大材小用。
- 系统复杂性提高,类数量较多。
二、迭代器模式
2.1 结构图
客户端即Main主函数,容器创建迭代器进行遍历。
2.2 代码示例
场景描述:设计一个简单容器存放数据,并用迭代器顺序遍历。
//Iterator.h /****************************************************/ #pragma once #include <iostream> #include <unordered_map> #include <vector> #include <list> #include <string> using namespace std; // 定义迭代器接口 class Iterator { public: // 下一个 virtual int next() = 0; // 是否有下一个 virtual bool hasNext() = 0; }; // 定义具体迭代器 class ConcreteIterator : public Iterator { public: // 构造函数 ConcreteIterator(std::vector<int> data) : m_data(data), index(0) {} // 下一个 virtual int next() { return m_data[index++]; } // 是否有下一个 virtual bool hasNext() { return index < m_data.size(); } private: std::vector<int> m_data; int index; }; // 定义容器接口 class Container { public: virtual Iterator* create_iterator() = 0; }; // 定义具体容器 class ConcreteContainer : public Container { public: // 构造函数 ConcreteContainer(std::vector<int> data) : m_data(data) {} // 创建迭代器 virtual Iterator* create_iterator() { return new ConcreteIterator(m_data); } private: std::vector<int> m_data; };
//main.cpp /****************************************************/ #include <iostream> #include <string> #include "Iterator.h" using namespace std; int main() { // 创建容器和迭代器 std::vector<int> data = { 1, 2, 3, 4, 5 }; Container* container = new ConcreteContainer(data); Iterator* iterator = container->create_iterator(); // 迭代器输出 while (iterator->hasNext()) { std::cout << iterator->next() << " "; } // 清除 delete iterator; delete container; iterator = nullptr; container = nullptr; return 0; }
程序结果如下。
迭代器应该算是大家熟知的内容了,在使用STL容器时,经常会用到各种迭代器。
三、总结
我尽可能用较通俗的话语和直观的代码例程,来表述我对迭代器模式的理解,或许有考虑不周到的地方,如果你有不同看法欢迎评论区交流!希望我举的例子能帮助你更好地理解迭代器模式。
如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!