设计模式之迭代器模式(C++)

简介: 设计模式之迭代器模式(C++)

一、迭代器模式是什么?

      迭代器模式是一种行为型的软件设计模式,提供一种方法能顺序访问聚合对象中的各个元素,而又不暴露其内部。


      我们使用的聚合对象各种各样,比如vector、list、tree、map等等,既然是聚合,那就有访问其个体的需要。而遍历访问这个行为可能有深度优先、广度优先、顺序遍历、逆序遍历等等,迭代器的意义就是将这个行为抽离封装起来,这样客户端只需要调用合适的迭代器,来进行对应的遍历,而不用自己去实现这一行为。


      迭代器模式的优点:


  1. 符合单一职责原则。将遍历行为抽离成单独的类。
  2. 符合开闭原则。添加新集合或者新迭代器,不改变原有代码。
  3. 便于扩展多种遍历行为。
  4. 访问数据又不暴露内部。

     迭代器模式的缺点:


  1. 若对聚合对象只需要进行简单的遍历行为,那使用迭代器模式有些大材小用。
  2. 系统复杂性提高,类数量较多。

二、迭代器模式

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容器时,经常会用到各种迭代器。

三、总结

      我尽可能用较通俗的话语和直观的代码例程,来表述我对迭代器模式的理解,或许有考虑不周到的地方,如果你有不同看法欢迎评论区交流!希望我举的例子能帮助你更好地理解迭代器模式。

      如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!

相关文章
|
1月前
|
设计模式 安全 测试技术
【C/C++ 设计模式 单例】单例模式的选择策略:何时使用,何时避免
【C/C++ 设计模式 单例】单例模式的选择策略:何时使用,何时避免
61 0
|
1月前
|
设计模式 算法 C++
【C++ 泛型编程 进阶篇】C++元模板编程与设计模式的结合应用教程(二)
【C++ 泛型编程 进阶篇】C++元模板编程与设计模式的结合应用教程
27 0
|
1月前
|
设计模式 存储 uml
C++ 设计模式实战:外观模式和访问者模式的结合使用,派生类访问基类的私有子系统
C++ 设计模式实战:外观模式和访问者模式的结合使用,派生类访问基类的私有子系统
29 1
|
1月前
|
设计模式 Java uml
C++设计模式之 依赖注入模式探索
C++设计模式之 依赖注入模式探索
37 0
|
3月前
|
设计模式 算法 Java
C++设计模式
C++设计模式
16 0
|
3天前
|
设计模式 存储 Java
C++从入门到精通:3.5设计模式——提升代码可维护性与可扩展性的关键
C++从入门到精通:3.5设计模式——提升代码可维护性与可扩展性的关键
|
3天前
|
设计模式 Go
[设计模式 Go实现] 行为型~迭代器模式
[设计模式 Go实现] 行为型~迭代器模式
|
15天前
|
设计模式 Java
小谈设计模式(21)—迭代器模式
小谈设计模式(21)—迭代器模式
|
1月前
|
设计模式 算法 中间件
【C++ 可调用对象的应用】C++设计模式与现代编程技巧:深入可调用对象的世界
【C++ 可调用对象的应用】C++设计模式与现代编程技巧:深入可调用对象的世界
114 1
|
1月前
|
设计模式 关系型数据库 数据库
【C++ 设计模式 工厂模式对比】深入探索设计模式:工厂方法与抽象工厂的比较与对照
【C++ 设计模式 工厂模式对比】深入探索设计模式:工厂方法与抽象工厂的比较与对照
21 1