C++ 大话设计之《迭代器模式》(优缺点,设计原理,常用场景)

2023-11-05

迭代器模式是一种行为型模式


 

优点:

  • 它支持以不同的方式遍历一个聚合对象,而无需暴露它的内部表示。
  • 迭代器简化了聚合类。
  • 在迭代器模式中,由于引入了抽象层,增加新的聚合类和迭代器类都很方便,无需修改原有代码。

缺点:

  • 由于多了一个抽象层,会增加系统的复杂性。
  • 对于简单的遍历(如数组),使用迭代器方式遍历较为繁琐。
  • 总之,迭代器模式在需要对聚合对象进行遍历时非常有用,它可以让用户通过特定的接口访问容器中的数据,而无需了解容器内部实现细节。

满足的设计原理:

  • “单一职责原则”要求一个类应该只有一个引起它变化的原因。在迭代器模式中,遍历操作被分离到了迭代器类中,使得聚合类和迭代器类各自只负责一件事,符合单一职责原则。
  • “迪米特法则”要求一个对象应当对其他对象有尽可能少的了解。在迭代器模式中,客户端只需要知道迭代器的接口,而无需了解聚合对象的内部实现,符合迪米特法则。

常用实例:

迭代器模式常用于遍历各种容器,如链表、数组、树等。例如,在STL(C++标准模板库)中,就广泛使用了迭代器模式。STL中的容器(如vector、list、set等)都提供了迭代器,可以使用迭代器来遍历容器中的元素。
 

类图:

常规代码:

#include "iostream"
#include "string"
#include <vector>

using namespace std;

class Aggregate
{
public:
	virtual ~Aggregate(){};
	virtual class Iterator*CreateIterator()=0;
	
};

class Iterator
{
public:
	virtual ~Iterator(){}
	virtual void First()=0;
	virtual void Next()=0;
	virtual bool IsDone()=0;
	virtual int CurrentItem()=0;
};

class ConcretaAggregate:public Aggregate {

public: 
	ConcretaAggregate(initializer_list<int> values):values_(values){}

	Iterator*CreateIterator();
	
	int Count()const
	{
		return values_.size();
	}

	int Get(int index)const
	{
		return values_[index];
	}


private:
	vector<int> values_;

};




class ConcreteIterator :public Iterator {
public:
	ConcreteIterator(const ConcretaAggregate*aggregate):aggregate_(aggregate),current_(0){}

	void First()
	{
		current_=0;
	}

	void Next()
	{
		++current_;
	}

	bool IsDone()
	{
		return current_>=aggregate_->Count();
	}

	int CurrentItem()
	{
		return aggregate_->Get(current_);
	}


private:
	const ConcretaAggregate*aggregate_;
	int current_;
};



Iterator* ConcretaAggregate::CreateIterator()
{
	return new ConcreteIterator(this);
}


int main() 
{
	ConcretaAggregate aggregate{1,2,3,4,5};
	Iterator*it=aggregate.CreateIterator();
	for (it->First();!it->IsDone();it->Next())
	{
		cout<<it->CurrentItem()<<endl;
	}
	vector<int> nu{1,2,3}; 

	for (vector<int>::iterator it=nu.begin();it!=nu.end();it++)
	{
	}

	return 0;
}

STL  C++ 标准容器类中类代码:

template<typename T>
class AA {
public:
	class iterator {
	public:
		iterator(T* ptr) : _ptr(ptr) {}
		iterator operator++() { ++_ptr; return *this; }
		bool operator!=(const iterator& other) const { return _ptr != other._ptr; }
		T operator*() const { return *_ptr; }
	private:
		T* _ptr;
	};
	AA(T* num, int size) : _num(num), _size(size) {}
	iterator begin() { return iterator(_num); }
	iterator end() { return iterator(_num + _size); }
private:
	T* _num;
	int _size;
};

int main() {
	int num[] = { 1, 2, 3, 4, 5 };
	AA<int> aa(num, sizeof(num) / sizeof(int));
	for (AA<int>::iterator it = aa.begin(); it != aa.end(); ++it) {
		std::cout << *it << std::endl;
	}
	return 0;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 大话设计之《迭代器模式》(优缺点,设计原理,常用场景) 的相关文章

随机推荐

  • 关于SQL注入报错:Illegal mix of collations for operation ‘UNION‘原因剖析与验证

    关于SQL注入报错 Illegal mix of collations for operation UNION 原因剖析与验证 今天练习了一下DVWA的SQL注入模块 使用了union注入时报错如下 Illegal mix of colla
  • 解决“vue-router子路由默认视图不显示”问题

    今天在看Vue学习视频 老师讲解vue router多级路由的使用 在写完视频里的例子后 自己测试发现一个小问题 当时视频里没有提及 我是用name实现的路由之间的切换 其中一个有子路由 发现子路由的默认显示没有了 第一次默认有 第二次点击
  • JVM GC算法 CMS 详解(转)

    前言 CMS 全称Concurrent Low Pause Collector 是jdk1 4后期版本开始引入的新gc算法 在jdk5和jdk6中得到了进一步改进 它的主要适合场景是对响应时间的重要性需求 大于对吞吐量的要求 能够承受垃圾回
  • Python标准库asyncio模块基本原理浅析

    Python标准库asyncio模块基本原理浅析 本文环境python3 7 0 asyncio模块的实现思路 当前编程语言都开始在语言层面上 开始简化对异步程序的编程过程 其中Python中也开始了在语言层面上对异步编程的简化 特地使用了
  • Redis分布式锁的实现(Jedis和Redisson两个方案)

    应用场景 分布式锁主要用于解决 公司中不同业务系统对同一功能的数据产生脏读或重复插入 比如公司现有三个小组分别开发WAP站 小程序 APP客户端 而这三个系统都存在领红包功能 业务要求每人每日只能领取一个红包 如果有人同时登陆三个系统那么就
  • C语言函数返回值不能直接写数组

    C语言返回值不能直接写数组 ifndef VMATH H define VMATH H ifdef cplusplus extern C endif typedef float Matrix44f 16 Matrix44f translat
  • 分布式事务理论与实践

    一 产生背景 业务服务化拆分 原本一个服务能完成的业务操作现在需要跨多个服务 分库分表 写操作可能跨多个数据库 二 理论基础 2 1 2PC协议 角色说明 事务管理器 负责分布式事务的发起与结束 以及失败重试等 事务发起方 资源管理器 本地
  • pyenv管理python版本

    一 介绍 pyenv 是 Python 版本管理工具 pyenv 可以改变全局的 Python 版本 安装多个版本的 Python 设置目录级别的 Python 版本 还能创建和管理 virtual python environments
  • 编程语言比拼之Java VS C++

    学Java还是C Java和C 都是非常受欢迎的编程语言 各有各的优势和适用场景 以下是对它们的简要比较 性能 C 通常被认为是一种更高效的编程语言 适用于对性能要求较高的应用程序 如游戏开发 嵌入式系统和高频交易等 C 具有更接近底层的控
  • 常用串口调试工具比较

    在PC机上 目前有许多免费的串口调试工具 比较常用的有 1 串口调试助手 V2 2 优点 使用方便 用户群最多 有书介绍及免费源代码 缺点 1 因采用多线程接收技术 接收有时丢数 特别在高波特率或使用USB转串口时丢数较多 2 最大只支持1
  • java数组之二分查找法(折半查找)

    二分法就是用折半的思想 屁话不多说 上源码 public class BinarySearch 二分查找法 折半 折半查找 使用条件 必须是有序数组 需要三个变量 int min 0 int max 数组 length int mid mi
  • 使用OpenCV,Numpy计算直方图,Matplot绘制直方图及分析

    使用OpenCV Numpy计算直方图 Matplot绘制直方图及分析 1 效果图 2 原理 3 源码 3 1 直方图3种计算方法和2种绘制方法 3 2 Mask遮罩图像直方图 参考 这篇博客将介绍如何使用Python OpenCV Num
  • AVALON-MM接口

    AVALON接口分为两类 一种是AVALON MM接口 一般称为MM接口 另一种是AVALON ST接口 刚出来的一种新型接口 MM接口 通过地址读写数据 更多的是用在控制上面 ST接口用于点到点的流数据接口 更多的可以用在有高速通过率的模
  • shell文件通配符(9):任意一个:?、任意数量:*、任意包含[]、[^]:任意不包含

    文章目录 一 有哪些文件通配符 二 匹配任意 匹配任意一个字符 匹配任意数量的字符串 三 匹配任意指定一个字符 1 匹配任意包含 匹配任意包含 字符范围 2 与 匹配任意不包含 四 注意事项 1 通配符组合 2 不能跨越目录层级进行通配 3
  • 云呐工单管理对售后服务的全流程进行精细化的管理

    伴随着市场环境的改变 服务管理已融入到各个行业并起着愈来愈重要的功用 成为企业提升产品附加值 施行差异化发展战略 继而获取核心竞争力的较佳方式 带来良好的服务管理有利于企业获取报告信息 减低顾客流失率和赢得更多新顾客 能够促进企业利润的稳步
  • html文字浮动效果,css浮动怎么理解?

    浮动的意义 设置了浮动属性的元素会脱离普通标准流的控制 移动到其父元素中指定的位置的过程 将块级元素放在一行 浮动会脱离标准流 不占位置 会影响标准流 浮动只有左右浮动 不会出现上下浮动 浮动的使用 基本语法格式 选择器 float 属性值
  • pycharm注释快捷键(多行注释快捷键,三引号注释快捷键...)

    一 前言 相信学习python的小伙伴们对pycharm这款软件并不陌生 有时候我们需要在pycharm里面进行批量注释 但是直接一个一个输入注释符号太麻烦了 下面教大家用快捷键进行注释 二 教程 1 多行 单行注释 import torc
  • element 表格内显示图片

    element 表格内显示图片 先看下效果图 如下 再看下前端代码
  • 时间序列分析教程(二):移动平均与指数平滑

    之前介绍了时间序列的基本概念和性质 现在就正式介绍一些处理时间序列的模型方法 第一个是移动平均法 移动平均法很简单 就是用最近的数据预测未来短时间内的数据 有简单移动平均法 真的很简单 就是用最近的一组数据 去平均 作为下一时刻的预测 S
  • C++ 大话设计之《迭代器模式》(优缺点,设计原理,常用场景)

    迭代器模式是一种行为型模式 优点 它支持以不同的方式遍历一个聚合对象 而无需暴露它的内部表示 迭代器简化了聚合类 在迭代器模式中 由于引入了抽象层 增加新的聚合类和迭代器类都很方便 无需修改原有代码 缺点 由于多了一个抽象层 会增加系统的复