c#设计模式-行为型模式 之 迭代器模式

🚀简介

提供一个对象来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示。

迭代器模式主要包含以下角色:

  1. 抽象聚合(Aggregate)角色:定义存储、添加、删除聚合元素以及创建迭代器对象的接口。
  2. 具体聚合(ConcreteAggregate)角色:实现抽象聚合类,返回一个具体迭代器的实例。
  3. 抽象迭代器(Iterator)角色:定义访问和遍历聚合元素的接口,通常包含 hasNext()next() 等方法。
  4. 具体迭代器(Concretelterator)角色:实现抽象迭代器接口中所定义的方法,完成对聚合对象的遍历,记录遍历的当前位置。

🚀案例

🐤抽象迭代器(Iterator)角色

//定义迭代器接口
public interface IIterator
{bool HasNext();object Next();
}

🐤抽象聚合(Aggregate)角色

//定义集合接口
public interface IAggregate
{IIterator GetIterator();
}

🐤具体聚合(ConcreteAggregate)角色

在这个类中,有一个私有的只读的List<string>类型的字段_items,用于存储字符串类型的数据。

GetIterator()方法返回一个IIterator类型的迭代器,这个迭代器是用于遍历_items中的数据。

Count属性返回_items中的元素数量。

索引器this[int index]用于获取或设置_items中指定索引位置的元素。

public class ConcreteAggregate : IAggregate
{private readonly List<string> _items = new List<string>();public IIterator GetIterator(){return new ConcreteIterator(this);}public int Count{get { return _items.Count; }}public string this[int index]{get { return _items[index]; }set { _items.Insert(index, value); }}
}

🐤具体迭代器(Concretelterator)角色

  • _aggregate是一个ConcreteAggregate类型的私有只读字段,它表示要遍历的聚合对象。
  • _current是一个私有字段,表示当前遍历到的位置。
  • ConcreteIterator(ConcreteAggregate aggregate)是一个构造函数,用于创建ConcreteIterator对象。这个构造函数需要一个ConcreteAggregate对象作为参数,但是这段代码中并没有显示这个构造函数的实现。
  • HasNext()方法用于判断是否还有下一个元素。如果当前位置_current小于聚合对象的元素数量,那么就返回true,表示还有下一个元素;否则返回false
  • Next()方法用于获取下一个元素。它返回当前位置_current的元素,并将_current加1,以便下次调用Next()时能返回下一个元素。
public class ConcreteIterator : IIterator
{private readonly ConcreteAggregate _aggregate;private int _current = 0;public ConcreteIterator(ConcreteAggregate aggregate){this._aggregate = aggregate;}public bool HasNext(){return _current < _aggregate.Count;}public object Next(){return _aggregate[_current++];}
}

🐳测试类

    public static void Main(string[] args){ConcreteAggregate a = new ConcreteAggregate();a[0] = "Item A";a[1] = "Item B";a[2] = "Item C";a[3] = "Item D";IIterator i = a.GetIterator();while (i.HasNext()){Console.WriteLine(i.Next());}}

👻运行结果!

🚀优缺点

优点:
  1. 它支持以不同的方式遍历一个聚合对象,在同一个聚合对象上可以定义多种遍历方式。在迭代器模式中只需要用一个不同的迭代器来替换原有迭代器即可改变遍历算法,我们也可以自己定义迭代器 的子类以支持新的遍历方式。
  2. 迭代器简化了聚合类。由于引入了迭代器,在原有的聚合对象中不需要再自行提供数据遍历等方法,这样可以简化聚合类的设计。
  3. 在迭代器模式中,由于引入了抽象层,增加新的聚合类和迭代器类都很方便,无须修改原有代码,满足开闭原则的要求。
缺点:
  1. 增加了类的个数,这在一定程度上增加了系统的复杂性。
使用场景
  1. 当需要为聚合对象提供多种遍历方式时。
  2. 当需要为遍历不同的聚合结构提供一个统一的接口时。
  3. 当访问一个聚合对象的内容而无须暴露其内部细节的表示时。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/102241.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Boot项目在Windows上的自启动策略与Windows自动登录配置

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

微服务架构

注&#xff1a;引用自 http://t.csdnimg.cn/32eMo 近年来&#xff0c;随着云计算和容器技术的迅猛发展&#xff0c;微服务架构逐渐成为了业界的热门话题。本篇文章将着重介绍微服务架构的概念、特点以及与传统架构的对比&#xff0c;并深入探讨微服务架构的核心技术和实现方法。…

如何压缩视频?视频压缩变小方法汇总

视频是我们日常生活中不可或缺的一部分&#xff0c;但视频文件往往会占用大量存储空间&#xff0c;这在传输和分享过程中可能成为一个瓶颈。 为了解决这一问题&#xff0c;我们可以通过压缩的方式减小视频大小&#xff0c;视频压缩是指在保证视频质量的前提下&#xff0c;通过…

漏洞复现--鸿运主动安全监控云平台任意文件下载

免责声明&#xff1a; **文章中涉及的漏洞均已修复&#xff0c;敏感信息均已做打码处理&#xff0c;文章仅做经验分享用途&#xff0c;切勿当真&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何…

golang实现中文分词,scws,jieba

一、scws 1、安装 scws 官网以及文档 https://github.com/hightman/scws wget -q -O - http://www.xunsearch.com/scws/down/scws-1.2.3.tar.bz2 | tar xjf -cd scws-1.2.3 ./configure --prefix/usr/local/scws --enable-shared make && make installLibraries hav…

Centos8 openjdk升级

1、卸载旧版本 sudo dnf remove java-1.8.0-openjdk 2、搜索新版本 yum search java-11-openjdk3、安装新版本 dnf install java-11-openjdk.x86_644、验证新版本 java -version

XSS原理

原理&#xff1a; 这是一种将任意 Javascript 代码插入到其他Web用户页面里执行以达到攻击目的的漏洞。攻击者利用浏览器的动态展示数据功能&#xff0c;在HTML页面里嵌入恶意代码。当用户浏览改页时&#xff0c;这些潜入在HTML中的恶意代码会被执行&#xff0c;用户浏览器被攻…

基于邻接矩阵的深度优先算法和广度优先算法

typedef struct {int vexs[5]; // 顶点int arcs[5][5]; //领接矩阵int vexnum, arcnum; //顶点数和边数 } AmGraph; //region 深度优先算法 void AM_DFS(AmGraph *g, int v) { // v 表示第几个顶点printf("%4d", g->vexs[v]);visit[v] 1; //表示已经访问过for (…

php实战案例记录(22)smarty模版引擎数组循环的方式

Smarty模板引擎中有两种主要的数组循环方式&#xff1a;foreach和section。 foreach循环用于像循环访问一个数字索引数组一样循环访问一个关联数组。它比section循环更简单&#xff0c;但仅适用于单个数组。每个foreach标记必须与关闭标记/foreach成对出现。例如&#xff1a; …

Ubuntu 22.04‘Temporary failure resolving‘ 解决方案

终极解决方案 首先安装resolvconf sudo apt-get install resolvconf 使用 cd /etc/resolvconf/resolv.conf.d/ 进入文件夹&#xff0c;使用 ls 查看目录&#xff0c;会显示 base head tail 使用 sudo vim base 编辑base文件&#xff0c; 进入时为空&#xff0c;点击 i 添加 …

Pytorch中张量的维度扩张与广播操作示例

广播操作允许你对不同形状的张量执行逐元素操作&#xff0c;而无需显式循环。 一个关于分子坐标离散格点化的实战例子&#xff1a; def cdists(mols, grid):Calculates the pairwise Euclidean distances between a set of molecules and a listof positions on a grid (uses…

不了解无线调制方式?这几个“老古董”大家现在还在用!

当我们使用手机、电视、互联网或其他无线通信设备进行通信时&#xff0c;数字调制技术起到了关键作用。这些技术是将我们的声音、文字、图像和数据转换成适合在无线信道上传输的模拟信号的重要工具。 从最早的调幅调制&#xff08;ASK&#xff09;到现代的正交频分复用&#xf…

语音芯片基础知识 什么是语音芯 他有什么作用 发展趋势是什么

目录 一、语音芯片的简介 常见的语音芯片有哪些&#xff1f; 语音芯片的种类有很多&#xff0c;大体区分下来也就4个类别而已&#xff1a; 选型的经验说明如下&#xff1a; 推荐使用flash型语音芯片 一、语音芯片的简介 语音芯片基础知识&#xff1a; 什么是语音芯片&…

再一次整理一下spring框架步骤

1.pom.xml依赖 2.applicationbean.xml 3.类 小树叶可以跟bean联动起来 不写接口直接写类 实现类 4.测试 两种方法的实现

SQL:left join、right join 究竟什么区别?

1、SQL join 分三种 1&#xff09;inner join&#xff08;内连接&#xff0c;也叫等值连接&#xff09; 显示两个表中有联系的所有数据&#xff0c;是默认方式。 2&#xff09;cross join&#xff08;交叉连接&#xff09; 两个表格做笛卡尔积&#xff0c;显示的数据行数是…

Android studio安装详细教程

Android studio安装详细教程 文章目录 Android studio安装详细教程一、下载Android studio二、安装Android Studio三、启动Android Studio 一、下载Android studio Android studio安装的前提是必须保证安装了jdk1.8版本以上 1、打开android studio的官网&#xff1a;Download…

20231010-学习笔记

文章目录 定位固定定位小技巧&#xff1a;固定在版心右侧位置元素的显示和隐藏单行文字溢出省略号显示多行文字溢出省略号显示&#xff08;兼容性有问题&#xff09;精灵图使用字体图标CSS三角做法界面样式解決图片底部默认空白缝隙问题Bootstrap前端开发框架资源 定位 定位 …

在Centos上配置bgp路由

BGP路由器 BGP&#xff08;边界网关协议&#xff09;是一种用于互联网路由的路由协议&#xff0c;可以实现不同自治系统&#xff08;AS&#xff09;之间的互联。BGP路由器是指运行BGP协议的路由器&#xff0c;能够对路由信息进行交换和选择&#xff0c;使得数据包能够根据最佳…

利用正则表达式进行数据采集和处理

目录 一、正则表达式的概述 二、正则表达式在数据采集中的运用 1、匹配和提取数据 2、数据清洗 3、数据验证 三、Python中的re模块介绍 1、re.match()方法 2、re.search()方法 总结 正则表达式是一种强大的文本处理工具&#xff0c;它可以用于模式匹配、提取、替换等操…

自动驾驶软件和人工智能

自动驾驶汽车的核心在于其软件系统&#xff0c;而其中的机器学习和深度学习技术是使车辆能够感知、理解、决策和行动的关键。本文将深入探讨这些技术在自动驾驶中的应用&#xff0c;包括感知、定位、路径规划以及道路标志和交通信号的识别。 1. 机器学习和深度学习在自动驾驶中…