当前位置: 首页 > article >正文

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

作者:翟天保Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

一、迭代器模式是什么?

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

       我们使用的聚合对象各种各样,比如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容器时,经常会用到各种迭代器。

三、总结

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

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


http://www.kler.cn/news/10355.html

相关文章:

  • 新品国产C2000,独立双核32位CPU,主频高达400MHz,QX320F280049
  • 数据分析-统计基础
  • 29岁,普通功能测试,我是如何在一周内拿到5份Offer的?
  • Linux 内存回收,思维导图记录
  • CMake项目使用ctest+gtest进行单元测试
  • Vulnhub:Digitalworld.local (Development)靶机
  • C++ 23 实用工具(二)绑定工具
  • 10.字符串
  • 学习机器人SLAM导航核心技术(一)
  • 网络之广播域和冲突域
  • Qt5.12实战之规则DLL导出函数使用
  • 什么是分布式锁
  • 软考第二章 数据通信基础
  • 写博客8年与人生第一个502万
  • 空间复杂度
  • Makefile第十课:Makefile编译
  • 当你觉得生活快熬不下去时,请你读一读《活着》
  • Elastic Enterprise Search 8.7:新连接器、网络爬虫提取规则和搜索分析客户端测试版
  • Golang数据类型比较
  • MongoDB
  • 使用 ArcGIS Pro 进行土地利用分类的机器学习和深度学习
  • SpringBoot常见的的面试点
  • ArrayList、LinkedList与Vector的区别?
  • 【自用】HTML笔记
  • VS Code 快捷键
  • 【C++11那些事儿(一)】
  • pandas读取Excel核心源码剖析,面向过程仿openpyxl源码实现Excel数据加载
  • 【RabbitMQ】
  • MATLAB算法实战应用案例精讲-【深度学习】多尺度特征融合(论文篇一)
  • Java知识点学习(第13天)