一、目的

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

二、定义

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

三、场景

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

四、实现

 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. webdriver xpath

    aa=wd.find_elements_by_xpath('//a') for a in aa: print(a.text) #显示所有A标签中文本 aa=wd.find_elements_by_xp ...

  2. java03类与对象相关问题

    1.使用类的静态字段和构造函数,可以跟踪某个类所创建对象的个数.请写一个类,在任何时候都可以向他查询"你已经创建了几个对象" 1 package 第四五周; 2 3 public ...

  3. [001] - JavaSE面试题(一):面向对象

    第一期:Java面试 - 100题,梳理各大网站优秀面试题.大家可以跟着我一起来刷刷Java理论知识 [001] - JavaSE面试题(一):面向对象 第1问:面向对象和面向过程的区别? 面向过程 ...

  4. Vue--之调试

    vue.文件的调试 方法:在chrome浏览器中,F12,在Sources中ctrl+F 查找leftMenu.vue, 打断点,F8完成加载

  5. Intouch 关于报表数据的一种思路

    在熟悉Intouch项目有一段时间了,也做有相关的三个项目,关于Intouch的一些报表数据的采集,也有了自己一定的看法(主要还是因为自己是野路子)今天就把我常用的一种制作思路,提供给大家.(仅供参考 ...

  6. GoAhead 远程命令执行漏洞(CVE-2017-17562)

    poc地址 https://github.com/ivanitlearning/CVE-2017-17562 执行 msfvenom -a x64 --platform Linux -p linux/ ...

  7. 一些Shell脚本记录

    查看换行符 使用vim打开文件,输入:set ff?.根据返回结果可以文件类型 字符串 opcenter.sjb.bz [root@opcenter backup]# echo ${HOSTNAME% ...

  8. Docker限制

    前言 Docker系列文章: 此篇是Docker系列的第十篇,大家一定要按照我做的Demo都手敲一遍,印象会更加深刻的,马上就开始Kubernetes,加油!一起前行! 为什么要学习Docker Do ...

  9. OSPF多区域

    目录 一.OSPF的多区域 1.1 生成OSPF多区域的原因 1.2 路由器的类型 1.3 区域的类型 二.链路状态数据库 2.1 链路状态数据库的组成 2.2链路状态通告 三.OSPF多区域配置 四 ...

  10. Flutter开发进阶学习指南Flutter开发进阶学习指南

    Flutter 的起源 Flutter 的诞生其实比较有意思,Flutter 诞生于 Chrome 团队的一场内部实验, 谷歌的前端团队在把前端一些"乱七八糟"的规范去掉后,发现在 ...