C#设计模式之迭代器模式

article/2025/10/3 15:41:02

迭代器模式

文章目录

  • 迭代器模式
    • 模式分类
    • 模式产生的原因
    • 模式的灵感来源
    • 模式类图
    • 代码实现
    • 迭代器模式总结
      • 迭代器模式的优点:
      • 迭代器模式的缺点:

本篇博客将介绍迭代器模式,迭代器模式将一个聚合对象保存数据的职责,和它遍历数据的职责分离,在引入迭代器后,聚合对象只负责保存数据,而遍历数据交给迭代器来完成。迭代器模式的介绍将参考.NET中的迭代器来进行说明。

模式分类

行为型设计模式。

模式产生的原因

在软件开发中,为了可以更加方便的操作聚合对象,同时可以很灵活的为聚合对象增加不同的遍历方法,我们需要一个解决方案可以让我们访问一个聚合对象但又不需要暴露它的内部结构。迭代器模式为我们解决了这个问题。它提供一种可以顺序访问一个聚合对象各个元素的方法且不会暴露该对象的内部表示。

模式的灵感来源

在现实生活中,人们有两种方法来操作电视机实现开机,关机,换台等操作。一种方法是使用电视机本身提供的操作面板上的按钮来说直接实现,另一种则是通过遥控器来间接控制电视机。遥控器的出现为电视机的操作带带来了极大的方便,用户并不需要知道电视机中是怎么存储频道的就可以实现换台。

模式类图

在这里插入图片描述

由图可知,迭代器模式由4个对象构成:

Aggregate(抽象聚合对象):

抽象聚合对象是所有的聚合对象的父类,它提供了一个获得迭代器的方法,在.NET中这个方法被封装在了另一个接口中,其实为了更加彻底的解耦,我们也可以采用.NET的方法,将GetIterator单独封装在一个接口中。

ConcreteAggregate(具体聚合对象):

具体的聚合对象,负责存储数据和获得迭代器,以方便遍历。

AbstractIterator(抽象迭代器):

抽象迭代器中有如何遍历聚合对象的基础方法,在具体迭代器中我们需要实现这些方法。

ConcreteIterator(具体迭代器):

具体迭代器负责实现抽象迭代器中的方法,并且要实现自己独有的遍历方法,一般我们可以在具体迭代器中书写当前迭代器的迭代逻辑。

代码实现

在代码实现里我使用了代理模式来延迟创建具体的迭代器,这样更加方便了实际使用的用户,但是加大了代码的书写逻辑。

抽象迭代器类:

using System.Collections.Generic;namespace Iterator.Iterator.Question3
{public abstract class MyIterator{protected List<int> MyList;protected int Index;public MyIterator(string name, List<int> list){MyList = list;}public abstract bool MoveNext();public abstract object Current();public abstract void Reset();}
}

获得迭代器接口:

namespace Iterator.Iterator.Question3
{public interface INewGetIterator{MyIterator GetIterator();}
}

迭代器代理类:

using System.Collections.Generic;
using System.Runtime.InteropServices;namespace Iterator.Iterator.Question3
{public class MCollectionAgent : MyIterator{private MyIterator _iterator;public MCollectionAgent(string name, List<int> list) : base(name, list){switch (name){case "AsOrder":_iterator = new AsOrder(name, list);break;case "DesOrder":_iterator = new DesOrder(name, list);break;}}public override bool MoveNext(){return _iterator.MoveNext();}public override object Current(){return _iterator.Current();}public override void Reset(){_iterator.Reset();}}
}

抽象聚合对象类:

using System.Collections.Generic;
using Iterator.Iterator.Example;namespace Iterator.Iterator.Question3
{public abstract class CollectionObject : INewGetIterator{protected List<int> MyList;public abstract MyIterator GetIterator();}
}

具体聚合对象A:

using System.Collections.Generic;namespace Iterator.Iterator.Question3
{public class CollectionA : CollectionObject{private string _name;public CollectionA(string name){_name = name;MyList = new List<int>(){1,2,3,4,5,6,7,8,9};}public override MyIterator GetIterator(){return new MCollectionAgent(_name, MyList);}}
}

升序遍历迭代器:

using System.Collections.Generic;namespace Iterator.Iterator.Question3
{public class AsOrder : MyIterator{public override bool MoveNext(){Index++;if (Index < MyList.Count){return true;}return false;}public override object Current(){return MyList[Index];}public override void Reset(){Index = -1;}public AsOrder(string name, List<int> list) : base(name,list){Index = -1;}}
}

降序遍历迭代器:

using System.Collections.Generic;namespace Iterator.Iterator.Question3
{public class DesOrder : MyIterator{public DesOrder(string name, List<int> list) : base(name, list){Index = MyList.Count;}public override bool MoveNext(){Index--;if (Index >= 0){return true;}return false;}public override object Current(){return MyList[Index];}public override void Reset(){Index = MyList.Count; }}
}

Program类:

using System;
using Iterator.Iterator.Question3;namespace Iterator
{internal class Program{public static void Main(string[] args){//降序遍历CollectionObject collectionObject = new CollectionA("DesOrder");MyIterator iterator = collectionObject.GetIterator();while (iterator.MoveNext()){Console.WriteLine(iterator.Current());}}}
}

迭代器模式总结

迭代器模式的优点:

  1. 迭代器模式支持以不同的方式遍历一个聚合对象,在同一个聚合对象中可以定义多种遍历方法。
  2. 迭代器简化了聚合对象,现在的聚合对象将不需要再考虑自己提供数据遍历的方法。

迭代器模式的缺点:

  1. 迭代器模式的使用会增加系统的复杂性。
  2. 迭代器模式的设计难度比较大,需要充分考虑系统将来的扩展。

http://chatgpt.dhexx.cn/article/AD6hFpr8.shtml

相关文章

迭代器模式实例与代码分析

目录 前言 一、&#x1f30d;迭代器&#xff08;Iterator&#xff09;模式是什么&#xff1f;&#x1f30d; 二、&#x1f30d;迭代器&#xff08;Iterator&#xff09;模式的优缺点&#x1f30d; 三、&#x1f30d;迭代器&#xff08;Iterator&#xff09;模式的结构&…

设计模式作业 之迭代器模式

设计一个逐页迭代器,每次可返回指定个数(一页)元素,并将该迭代器用手对数据进行分页处理。绘制对应的类图并编程模拟实现。 &#xff08;1&#xff09;绘制类图 &#xff08;2&#xff09;代码实现 AbstractAggregate类&#xff1a; package lib6.iterator;public interface…

迭代器模式讲解

学习设计模式&#xff0c;让你提升百倍 专栏重点文章设计模式设计模式基础前奏&#xff08;上&#xff09;设计模式设计模式基础前奏&#xff08;下&#xff09;设计模式创建者模式之单例模式设计模式创建者模式之工厂模式设计模式创建者模式之原型模式设计模式创建者模式之建…

设计模式之迭代器模式(十三)

目录 1. 背景 1.1 学院展示问题 1.2 迭代器模式概述 2. 迭代器模式 2.1 迭代器解决院校展示 2.2 迭代器模式在JDK ArrayList中的应用 1. 背景 1.1 学院展示问题 编写程序展示一个学校院系结构&#xff1a;需求是这样&#xff0c;要在一个页面中展示出学校的院系 组成&am…

设计模式——迭代器模式(附代码示例)

一. 传统方式 以学校院系展示为例&#xff0c;实现在一个页面展示学校的院系组成&#xff0c;一个学校有多个学院&#xff0c;一个学院有多个系。传统方式实现类图如下&#xff1a; 传统方式将学院看做是学校的子类&#xff0c;系是学院的子类&#xff0c;这样实际上是站在组织…

C++设计模式(20)——迭代器模式

亦称&#xff1a; Iterator 意图 迭代器模式是一种行为设计模式&#xff0c; 让你能在不暴露集合底层表现形式 &#xff08;列表、 栈和树等&#xff09; 的情况下遍历集合中所有的元素。 问题 集合是编程中最常使用的数据类型之一。 尽管如此&#xff0c; 集合只是一组对…

迭代器模式 - Unity

文章目录 迭代器模式结构实现应用场景优缺点与其他模式的关系 迭代器模式 迭代器模式是对象行为型模式&#xff0c;它提供一个对象来顺序访问聚合对象中的元素&#xff08;遍历元素的算法&#xff09;&#xff0c;且不暴露底层实现。 集合是编程中非常常见的数据结构之一。对…

迭代器模式(C++实现)

迭代器模式 1.定义2.迭代器模式的相关组成抽象聚合类具体聚合类抽象迭代器类具体迭代器类 3.代码实现运行结果演示 4.优缺点 1.定义 提供一种顺序访问集合内元素的方法&#xff0c;但不暴露集合内部实现细节的设计模式&#xff0c;属于行为型设计模式. 迭代器模式将数据的存储…

设计模式之迭代器模式

迭代器模式是一种行为设计模式&#xff0c; 让你能在不暴露集合底层表现形式 &#xff08;列表、 栈和树等&#xff09; 的情况下遍历集合中所有的元素。 集合是编程中最常使用的数据类型之一。 尽管如此&#xff0c; 集合只是一组对象的容器而已。大部分集合使用简单列表存储…

Java设计模式之行为型:迭代器模式

一、什么是迭代器模式&#xff1a; 实际开发中&#xff0c;我们针对不同的需求&#xff0c;可能需要以不同的方式来遍历整个整合对象&#xff0c;但我们不希望在集合容器的抽象接口层中充斥着各种不同的遍历操作&#xff0c;这时候我们就需要一种能完成下面功能的迭代器&#x…

迭代器模式

一、迭代器模式 1、定义 迭代器模式&#xff08;Iterator Pattern&#xff09;又称作游标模式&#xff08;Cursor Pattern&#xff09;,它提供一种按顺序访问集合/聚合/容器对象元素的方法&#xff0c;而又无须暴露集合内部表示。迭代器模式可以为不同的容器提供一致的遍历行为…

设计模式——迭代器模式

迭代器模式 1.迭代器模式动机及定义 1.1模式动机 聚合对象用于存储多个对象&#xff0c;在软件开发中应用广泛&#xff0c;为了更加方便地操作聚合对象&#xff0c;在很多编程语言中都提供了迭代器&#xff08;Iterator&#xff09;,迭代器本身也是一个对象&#xff0c;它的工…

【设计模式】迭代器模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

文章目录 一、迭代器模式简介二、迭代器模式适用场景三、迭代器模式优缺点四、迭代器模式和访问者模式五、迭代器模式代码示例1、迭代器接口2、迭代器实现3、集合元素实例类4、集合管理接口5、集合管理实现类6、测试类 一、迭代器模式简介 迭代器模式 : 提供一种方法 , 顺序访问…

SOME/IP报文格式-Payload

Payload [variable size] In the payload field the parameters are carried. Parameter被携带于Payload字段中 。The size of the SOME/IP payload field depends on the transport protocol used. With UDP the SOME/IP payload shall be between 0 and 1400 Bytes. The lim…

IP协议数据报格式详解

&#x1f431;‍&#x1f3cd;写博客的主要原因是为了巩固所学知识 &#x1f431;‍&#x1f3cd; IP数据报格式 4位版本号(Version) 由4比特组成&#xff0c;用来指定IP协议的版本。IPv4的版本号为4&#xff0c;即0100。 4位首部长度(Header Length) 由4比特组成&#xff0c;表…

IP数据报文格式

【转载】http://blog.csdn.net/shinezhang86/article/details/47145907 由于记性不好的原因, 一直对报文格式的字段记的不是很牢固, 故花了一天时间学习IP报文格式, 第二天来总结. 过两天再继续学习TCP和UDP. IP报文格式如下图所示(图片来源—百度百科): 版本(Version, 4bit):为…

IPv6报文格式

IPv6报文 IPv6报文分为两大部分&#xff1a;报头&#xff0c;负载。 报头 IPv6的报头是固定的320bit&#xff0c;不同与IPv4&#xff0c;IPv6把可选项从标准头部中移除&#xff0c;标准头部包含着版本号、流量类型、流标签、负载数据的长度、下一协议报头、生存时间&#xff08…

IP 协议报文格式 【IPv4】

前言: IP 数据报文由首部&#xff08;称为报头&#xff09;和数据两部分组成&#xff1b;首部的前一部分是固定长度&#xff0c;共 20 字节&#xff0c;是所有 IP 数据报必须具有的&#xff1b;在首部的固定部分的后面是一些可选字段&#xff0c;其长度是可变的 每个 IP 数据报…

TCP和UDP以及IP报文格式

TCP和UDP以及IP报文格式 TCP报文&#xff1a; 源端口&#xff1a; 数据发送方的端口号。 目的端口&#xff1a; 数据接受方的端口号。 序号&#xff1a;本数据报文中的的第一个字节的序号&#xff08;在数据流中每个字节都对应一个序号&#xff09;。 确认号&#xff1a;希望…

ipv4 报文格式中文描述

ipv4 报文格式中文描述 ipv4 英文描述 第一行 报文头部 20 byte 选项 40 byte ver 版本&#xff1a;4位 ipv40100hlen 头部长度&#xff1a;4bit 固定头部 选项 用4byte 为单位标记头部长度 &#xff08;5-15&#xff09;0101-1111tos服务类型&#xff1a;8位total length 报…