一、目的

提供一种方法访问一个容器对象中各个元素,而又不需暴露该对象的内部细节。

二、定义

迭代器模式提供了一种方法访问一个聚合对象(理解为集合对象)中各个元素,而又无需暴露该对象的内部表示,这样既可以不对外暴露内部结构,同时也可让外部代码透明地访问集合内部的数据。

三、场景

假设我们有一个自定义的集合数据,以下我们将采用迭代器模式来遍历这个集合。

四、实现

 1 using System;
2 using System.Collections.Generic;
3
4 namespace DesignMode_Iterator
5 {
6 public interface IListCollection
7 {
8 IIterator GetIterator();
9 }
10
11 public interface IIterator
12 {
13 bool MoveNext();
14 Object GetCurrent();
15 void Next();
16 void Reset();
17 }
18
19 public class ConcreteList : IListCollection
20 {
21 int[] collection;
22 public ConcreteList()
23 {
24 collection = new int[] { 2, 4, 5, 8, 10, 12, 14 };
25 }
26 public IIterator GetIterator()
27 {
28 return new ConcreteIterator(this);
29 }
30 public int Length
31 {
32 get
33 {
34 return collection.Length;
35 }
36 }
37 public int GetElement(int index)
38 {
39 return collection[index];
40 }
41 }
42
43 public class ConcreteIterator : IIterator
44 {
45 private ConcreteList _list;
46 private int _index;
47 public ConcreteIterator(ConcreteList list)
48 {
49 this._list = list;
50 _index = 0;
51 }
52
53 public bool MoveNext()
54 {
55 if (_index < _list.Length)
56 {
57 return true;
58 }
59 return false;
60 }
61 public Object GetCurrent()
62 {
63 return _list.GetElement(_index);
64 }
65 public void Reset()
66 {
67 _index = 0;
68 }
69 public void Next()
70 {
71 if (_index < _list.Length)
72 {
73 _index++;
74 }
75 }
76 }
77 class Program
78 {
79 static void Main(string[] args)
80 {
81 List<int> a = new List<int>();
82
83 IIterator iterator;
84 IListCollection list = new ConcreteList();
85 iterator = list.GetIterator();
86 while (iterator.MoveNext())
87 {
88 int i = (int)iterator.GetCurrent();
89 Console.Write(i.ToString() + " ");
90 iterator.Next();
91 }
92 Console.WriteLine();
93 }
94 }
95 }

运行结果如下:

五、类图

六、描述

从上图可以看出,迭代器模式主要由以下角色组成:

(1)迭代器角色(Iterator):迭代器角色负责定义访问和遍历元素的接口。

(2)具体迭代器角色(Concrete Iteraror):具体迭代器角色实现了迭代器接口,并需要记录遍历中的当前位置。

(3)聚合角色(Aggregate):聚合角色负责定义获得迭代器角色的接口。

(4)具体聚合角色(Concrete Aggregate):具体聚合角色实现聚合角色接口。

七、在.Net中的应用

  在.NET下,迭代器模式中的聚集接口和迭代器接口都已经存在了,其中IEnumerator接口扮演的就是迭代器角色,IEnumberable接口则扮演的就是抽象聚集的角色,只有一个GetEnumerator()方法,关于这两个接口的定义可以自行参考MSDN。在.NET 1.0中,.NET 类库中很多集合都已经实现了迭代器模式,大家可以用反编译工具Reflector来查看下mscorlib程序集下的System.Collections命名空间下的类,这里给出ArrayList的定义代码,具体实现代码可以自行用反编译工具查看,具体代码如下所示:

 1 public class ArrayList : IList, ICollection, IEnumerable, ICloneable
2 {
3 // Fields
4 private const int _defaultCapacity = 4;
5 private object[] _items;
6 private int _size;
7 [NonSerialized]
8 private object _syncRoot;
9 private int _version;
10 private static readonly object[] emptyArray;
11
12 public virtual IEnumerator GetEnumerator();
13 public virtual IEnumerator GetEnumerator(int index, int count);
14
15 // Properties
16 public virtual int Capacity { get; set; }
17 public virtual int Count { get; }
18 ..............// 更多代码请自行用反编译工具Reflector查看
19 }

C#设计模式---迭代器模式(Iterator Pattern)的更多相关文章

  1. 设计模式 - 迭代器模式(iterator pattern) 具体解释

    迭代器模式(iterator pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 迭代器模式(iterator pattern) : 提供一 ...

  2. C#设计模式——迭代器模式(Iterator Pattern)

    一.概述在软件开发过程中,我们可能会希望在不暴露一个集合对象内部结构的同时,可以让外部代码透明地访问其中包含的元素.迭代器模式可以解决这一问题.二.迭代器模式迭代器模式提供一种方法顺序访问一个集合对象 ...

  3. 设计模式(十):从电影院中认识"迭代器模式"(Iterator Pattern)

    上篇博客我们从醋溜土豆丝与清炒苦瓜中认识了“模板方法模式”,那么在今天这篇博客中我们要从电影院中来认识"迭代器模式"(Iterator Pattern).“迭代器模式”顾名思义就是 ...

  4. 乐在其中设计模式(C#) - 迭代器模式(Iterator Pattern)

    原文:乐在其中设计模式(C#) - 迭代器模式(Iterator Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 迭代器模式(Iterator Pattern) 作者:weba ...

  5. 设计模式学习--迭代器模式(Iterator Pattern)和组合模式(Composite Pattern)

    设计模式学习--迭代器模式(Iterator Pattern) 概述 ——————————————————————————————————————————————————— 迭代器模式提供一种方法顺序 ...

  6. 设计模式系列之迭代器模式(Iterator Pattern)——遍历聚合对象中的元素

    模式概述 模式定义 模式结构图 模式伪代码 模式改进 模式应用 模式在JDK中的应用 模式在开源项目中的应用 模式总结 说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修 ...

  7. 设计模式 - 迭代模式(iterator pattern) Java 迭代器(Iterator) 详细解释

    迭代模式(iterator pattern) Java 迭代器(Iterator) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 參考迭代器模式(ite ...

  8. 二十四种设计模式:迭代器模式(Iterator Pattern)

    迭代器模式(Iterator Pattern) 介绍提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示. 示例有一个Message实体类,某聚合对象内的各个元素均为该实体对象,现 ...

  9. [设计模式] 16 迭代器模式 Iterator Pattern

    在GOF的<设计模式:可复用面向对象软件的基础>一书中对迭代器模式是这样说的:提供一种方法顺序访问一个聚合对象中各个元素,而又不需要暴露该对象的内部表示. 类图和实例: 迭代器模式由以下角 ...

  10. javascript设计模式-迭代器模式(Iterator)

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

随机推荐

  1. 【字符串+排序】宇宙总统 luogu-1781

    题目描述 地球历公元6036年,全宇宙准备竞选一个最贤能的人当总统,共有n个非凡拔尖的人竞选总统,现在票数已经统计完毕,请你算出谁能够当上总统. 分析 给字符串排个序. AC代码 #include & ...

  2. odoo14--odoo前端框架owl【odoo web library】

    原文链接:https://www.alanhou.org/odoo-14-owl-todolist/ 1.组件树 Root         /   \        A     B       / \ ...

  3. 一文说清OpenCL框架

    背景 Read the fucking official documents! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: 对不 ...

  4. IE浏览器 查看Form对象

    在ie的debug窗口中,查看form中的值,从form.all("OtherNo").value = 赋值;(fm.all('ActionFlag').value = " ...

  5. CSRF+XSRF+SSRF简单介绍

    CSRF 使用DVWA靶机,选择low级别,然后更改密码 伪造网页连接 http://localhost:8083/DVWA-master/vulnerabilities/csrf/?password ...

  6. 2020厦门大学综述翻译:3D点云深度学习(Remote Sensiong期刊)

    目录 摘要 1.引言: 2.点云深度学习的挑战 3.基于结构化网格的学习 3.1 基于体素 3.2 基于多视图 3.3 高维晶格 4.直接在点云上进行的深度学习 4.1 PointNet 4.2 局部 ...

  7. 我为什么选Markdown

    前沿说明:Yaml Front Matter MarkDown 目录 前沿说明:Yaml Front Matter 什么是MarkDown Markdown是一种轻量级标记语言, 它允许人们使用易读易 ...

  8. 字节跳动已经10万人了?渣本双非Android程序员怎么上车?

    字节跳动已经 10 万人了? 是的,在 2020 年字节跳动的员工总数从 6 万蹿到 10 万,平均每个工作日就有 150 人在办理入职,加入字节跳动全球超过 240 个办公点. 更有统计,在总部北京 ...

  9. Microservices==>Service Mesh==>Serverless,走马观花

    [0] 始有道 话说图灵开天辟地,冯.诺伊曼造石补天! 始有道道生ML Machine LanguageML生汇编 assembler汇编生编译器 compiler编译器生PL Programming ...

  10. UNIX环境高级编程APUE练习4.6-实现类似cp(1)的程序,保留文件中的空洞

    1 题面 编写类似cp(1)的程序,它复制包含空洞的文件,但是不将字节0写到输出文件中去. 2 基本思路 首先要搞清楚空洞的性质以判断一个文件是否有空洞,以及空洞的位置 知道了空洞的位置之后,读到源文 ...