C#设计模式---迭代器模式(Iterator Pattern)
一、目的
提供一种方法访问一个容器对象中各个元素,而又不需暴露该对象的内部细节。
二、定义
迭代器模式提供了一种方法访问一个聚合对象(理解为集合对象)中各个元素,而又无需暴露该对象的内部表示,这样既可以不对外暴露内部结构,同时也可让外部代码透明地访问集合内部的数据。
三、场景
假设我们有一个自定义的集合数据,以下我们将采用迭代器模式来遍历这个集合。
四、实现
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)的更多相关文章
- 设计模式 - 迭代器模式(iterator pattern) 具体解释
迭代器模式(iterator pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 迭代器模式(iterator pattern) : 提供一 ...
- C#设计模式——迭代器模式(Iterator Pattern)
一.概述在软件开发过程中,我们可能会希望在不暴露一个集合对象内部结构的同时,可以让外部代码透明地访问其中包含的元素.迭代器模式可以解决这一问题.二.迭代器模式迭代器模式提供一种方法顺序访问一个集合对象 ...
- 设计模式(十):从电影院中认识"迭代器模式"(Iterator Pattern)
上篇博客我们从醋溜土豆丝与清炒苦瓜中认识了“模板方法模式”,那么在今天这篇博客中我们要从电影院中来认识"迭代器模式"(Iterator Pattern).“迭代器模式”顾名思义就是 ...
- 乐在其中设计模式(C#) - 迭代器模式(Iterator Pattern)
原文:乐在其中设计模式(C#) - 迭代器模式(Iterator Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 迭代器模式(Iterator Pattern) 作者:weba ...
- 设计模式学习--迭代器模式(Iterator Pattern)和组合模式(Composite Pattern)
设计模式学习--迭代器模式(Iterator Pattern) 概述 ——————————————————————————————————————————————————— 迭代器模式提供一种方法顺序 ...
- 设计模式系列之迭代器模式(Iterator Pattern)——遍历聚合对象中的元素
模式概述 模式定义 模式结构图 模式伪代码 模式改进 模式应用 模式在JDK中的应用 模式在开源项目中的应用 模式总结 说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修 ...
- 设计模式 - 迭代模式(iterator pattern) Java 迭代器(Iterator) 详细解释
迭代模式(iterator pattern) Java 迭代器(Iterator) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 參考迭代器模式(ite ...
- 二十四种设计模式:迭代器模式(Iterator Pattern)
迭代器模式(Iterator Pattern) 介绍提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示. 示例有一个Message实体类,某聚合对象内的各个元素均为该实体对象,现 ...
- [设计模式] 16 迭代器模式 Iterator Pattern
在GOF的<设计模式:可复用面向对象软件的基础>一书中对迭代器模式是这样说的:提供一种方法顺序访问一个聚合对象中各个元素,而又不需要暴露该对象的内部表示. 类图和实例: 迭代器模式由以下角 ...
- javascript设计模式-迭代器模式(Iterator)
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
随机推荐
- POJ 博弈论
poj1704 Georgia and Bob 题目链接:http://poj.org/problem?id=1704 题意:如图所示,两个人在玩一个游戏,排成直线的格子上有n个棋子,两人依次将棋子向 ...
- Scala学习——函数
一.函数的定义(def) object FunctionApp { //定义函数:方法体内最后一行为返回值,不需要使用return def add(a:Int,b:Int):Int={ a + b } ...
- 足不出户,一探古今,打造线上3D数字博物馆!
随着3D技术的不断革新,为了让更多的用户领略历史之美,越来越多的博物馆开始举办线上展览.通过模拟不同的环境.灯光投影.360°无死角放大缩小展品,观众可以享受到身临其境的沉浸体验.不仅如此,给展品加上 ...
- python中的生成器,迭代器及列表生成式
列表生成器: 即List Comprehensions. 在python中,可通过内置的强大有简单的生成式来创建列表.例如创建一个1到10的列表list [1, 2, 3, 4, 5, 6, 7, ...
- Ubuntu Server连接Wi-Fi
本文将介绍Ubuntu Server如何通过命令行使用wpa_supplicant连接Wi-Fi 环境 Ubuntu Server 20.04(64位) wpasupplicant 配置 1. 安装 ...
- Python - 详解 range()
介绍 range 是一个类,不是函数 表示不可变的数字序列,通常用于在 for 循环中循环指定的次数 两种语法格式 range(stop) 表示区间 [0, stop) 内的整数序列 该区间从 0 开 ...
- C#曲线分析平台的制作(五,Sqldependency+Signalr+windows 服务 学习资料总结)
在前篇博客中,利用interval()函数,进行ajax轮询初步的实现的对数据的实时显示.但是在工业级别实时显示中,这并非是一种最好的解决方案.随着Html5 websocket的发展,这种全双工的通 ...
- ajax 提交序列化表单
1.提交序列化表单+参数: var a = $.param({'address':address,'delivity':delivity,'payment':payment}) + '&' + ...
- Wordpress 4.6 任意命令执行漏洞(PwnScriptum)
漏洞存在后台登录地方的找回密码页面:http://192.168.49.2:8080/wp-login.php?action=lostpassword 抓包进行修改包 输入一个存在的用户,然后点击获取 ...
- 关于在iar+j-link上的坑坑洼洼
引言 iar版本为8.32,j-link驱动版本为4.34,对应的是stm32 ARM cortex-m3 ,文末有本文的软件和工具,以及需要的文件的链接(免费) 第一坑:iar注册机不能注册iar9 ...