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

news2024/11/18 2:45:16

🚀简介

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

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

  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.coloradmin.cn/o/1082326.html

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

相关文章

flask vue跨域问题

问题&#xff1a; 调试时候跨域访问报&#xff1a; Request header field authorization is not allowed by Access-Control-Allow-Headers in preflight response. 解决办法&#xff1a; 安装flask_cros from flask_cors import CORS CORS(app) app.after_request def a…

linux用户管理,用户权限命令详解

一.用户管理 Linux 同时可以支持多个用户&#xff0c;每个用户对自己的文件设备有特殊的权利&#xff0c;能够保证用户之间互不干扰,就像手机开了助手一样&#xff0c;同时登陆多个 qq 账号&#xff0c;当硬件配置非常高时&#xff0c;每个用户还可以同时执行多个任务&#xf…

Langchain 代理 (Agents) ,赋能超级 LLMs

原文&#xff1a;Langchain 代理 (Agents) &#xff0c;赋能超级 LLMs - 知乎 大型语言模型&#xff08;LLMs&#xff09; 非常强大&#xff0c;但它们缺乏“最笨”的计算机程序可以轻松处理的特定能力。逻辑、计算和搜索是计算机通常擅长的领域&#xff0c;但 LLMs 却遇到了困…

上个月Balada Injector攻击中有超过17,000个WordPress网站被黑

导语 最近&#xff0c;一场名为Balada Injector的攻击活动引起了广泛关注。这次攻击以WordPress网站为目标&#xff0c;据统计&#xff0c;有超过17,000个网站受到了感染。在本文中&#xff0c;我们将详细介绍这次攻击的概述、攻击手段以及如何保护自己的网站。 攻击概述 Balad…

HTTP/2 中的漏洞

另一个热门漏洞是 CVE-2023-44487。 该漏洞与 HTTP/2 协议实施中的一个缺陷有关&#xff0c;可用于实施 DDoS 攻击。使用该漏洞的攻击被命名为 HTTP/2 快速重置。 为什么它很危险 要利用该漏洞&#xff0c;攻击者需要在 HTTP/2 会话中打开大量请求&#xff0c;然后在不等待服…

什么是Python虚拟环境?

视频教程地址&#xff1a;https://www.bilibili.com/video/BV1Zy4y1F7hC/ 大家好&#xff0c;这一集我们来介绍一下什么是Python虚假环境。虚拟环境是python基础知识中非常重要的一个知识点。 相信python新手都会遇到过这样的问题&#xff0c;在命令行中下载了某个三方库在py…

graphviz 绘制红黑树

代码 digraph RedBlackTree {node [fontname"Arial", shapecircle, stylefilled, color"#ffffff", fillcolor"#ff0000", fontsize12, width0.5, height0.5];edge [fontname"Arial", fontsize10, color"#333333", arrowsize…

竞赛抢答器4路抢答器verilog,仿真视频、代码、AX301开发板

名称&#xff1a;数字式竞赛抢答器设计4路抢答器verilog 软件&#xff1a;Quartus 语言&#xff1a;Verilog 代码功能&#xff1a; 数字式竞赛抢答器设计 设计一个可容纳四组参赛者同时抢答的数字抢答器。 要求&#xff1a; &#xff08;1&#xff09;能判断第一抢答者并…

【C++初阶(一)】学习前言 命名空间与IO流

本专栏内容为&#xff1a;C学习专栏&#xff0c;分为初阶和进阶两部分。 通过本专栏的深入学习&#xff0c;你可以了解并掌握C。 &#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;C &#x1f69a;代码仓库&#xff1a;小小unicorn的代码仓库&…

【python】time

文章目录 【calendar】是否闰年星期英文缩写今天星期几打印日历 【datetime】今天星期几 【time】当前时间 【pandas】当前时间文件修改的时间 【日历】 【calendar】 是否闰年 import calendar print(calendar.isleap(2000))out True星期英文缩写 print(calendar.weekhead…

Zookeeper经典应用场景实战

1. Zookeeper Java客户端实战 ZooKeeper应用的开发主要通过Java客户端API去连接和操作ZooKeeper集群。可供选择的Java客户端API有&#xff1a; ZooKeeper官方的Java客户端API。第三方的Java客户端API&#xff0c;比如Curator。 ZooKeeper官方的客户端API提供了基本的操作。例…

Gin框架中的Cookie怎么搞(会话控制)

参考地址 设置和获取 Cookie | Gin Web Framework (gin-gonic.com)https://gin-gonic.com/zh-cn/docs/examples/cookie/ 什么是cookie cookie在互联网上随处可见,具体体现如下: 保持登录状态 保存浏览器的历史记录 大数据随心配,按喜好推送讯息 购物网站加入购物车 都会…

内存概念,进程运行的基本原理(指令,逻辑地址与物理地址的转换,程序运行的过程)

1.内存 内存可存放数据。 程序执行前需要先放到内存中才能被CPU处理&#xff1a;缓和cPU与硬盘之间的速度矛盾。 1.内存地址 内存地址从0开始&#xff0c;每个地址对应个存储单元。 2.存储单元 内存中也有一个一个的“小房间”&#xff0c;每个小房间就是一个“存储单元”…

RS485通讯方式-详解

RS485是美国电子工业协会&#xff08;EIA&#xff09;在1983年批准的一个新的平衡传输标准&#xff0c;也称作差分。 RS485总线通常采用两线间的电压差为2V到6V表示逻辑1&#xff0c;以两线间的电压差为-2V到-6V表示逻辑0。 这种总线以其差分传输方式而闻名&#xff0c;发送端在…

C语言常见题目 过关斩将(2)基础好❓你可知道有关 “素数“ 的三连问❓

我的个人主页&#xff1a;☆光之梦☆的博客_CSDN博客-C语言基础语法&#xff08;超详细&#xff09;领域博主 欢迎各位 &#x1f44d;点赞 ⭐收藏 &#x1f4dd;评论 特别标注&#xff1a;本博主将会长期更新c语言的语法知识&#xff0c;初学c语言的朋友们&#xff0c;可以收藏…

从0开始学go第七天

gin获取表单from中的数据 模拟简单登录页面&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>login</title> </head><body><form action"/login" method&q…

SLAM从入门到精通(launch文件学习)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 大家应该还记得我们在一开始学习ros的时候&#xff0c;如果需要启动一个节点的话&#xff0c;需要首先打开roscore&#xff0c;接着用rosrun打开对…

Java进击框架:Spring-Bean初始化过程(五)

Java进击框架&#xff1a;Spring-Bean初始化过程&#xff08;五&#xff09; 前言源码初始化配置加载Bean加载Bean对象加载Bean切面 Bean工厂后置处理器注册Bean后置处理器初始化消息源初始化应用程序事件多播器注册监听器完成Bean工厂初始化Bean初始化完成刷新应用上下文创建完…

VSCODE+PHP8.2配置踩坑记录

VSCODEPHP8.2配置踩坑记录 – WhiteNights Site 我配置过的最恶心的环境之一&#xff1a;windows上的php。另一个是我centos服务器上的php。 进不了断点 端口配置和xdebug的安装 这个应该是最常见的问题了。从网上下载完php并解压到本地&#xff0c;打开vscode&#xff0c;安装…

前端 | 前端工程化

文章目录 前端工程化1. Vue项目创建2. Vue项目目录结构3. vue项目开发 前端工程化 1. Vue项目创建 安装插件vue-cli npm install -g vue/cli命令行创建 Vue 项目 vue create vue-project(项目名称)图形化界面创建 VUe 项目 vue ui图形化界面如下&#xff1a; 选择功能&…