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 ...
随机推荐
- maven添加阿里云镜像
apache的maven服务器国内访问太慢了,用阿里的镜像会好很多. 1.maven的配置文件有两个,安装目录conf文件夹下settings.xml和用户目录.m2文件夹下的settings.xml ...
- C标准库学习
前言 C标准库源码可通过下列两个网站进行查看:The GNU C Library.Welcome to uClibc-ng! - Embedded C library 以下学习记录也是以这两个网站提供 ...
- mybatis-3-核心配置文件
全局配置文件:mybatis-config.xml 1.引入外部配置文件(properties) date.properties外部配置文件 driver = com.mysql.cj.jdbc.Dr ...
- PHP获取当日或本月时间戳范围
在mysql数据库中使用int类型保存时间戳时,一般在程序中可能会用到统计当日,当月的一些数据.那么可以用如下的方式限定时间范围: //当日销售 $today_start = strtotime( ...
- bootstrap与vue的区别是什么?(十七)
Bootstrap Bootstrap是美国Twitter公司的设计师Mark Otto和Jacob Thornton合作基于HTML.CSS.JavaScript 开发的简洁.直观.强悍的前端开发框 ...
- js循环修改对象内层元素的值
问题:存在一个对象,该对象的内部元素也为对象,子对象的元素也为对象,...(即多层对象构成的对象,具体如下),那么应该如何修改最内层元素的值(如 obj.a.a.a = 5)? var obj = { ...
- TS中 使用deprecated 实现对方法的迭代弃用
在日常开发中,我们会定义大量方法函数来提供给业务调用,可随着时间与业务的推进, 有些方法可能不切合当下需求, 或将被逐步废弃并替换到新的方法中, 例如 框架中 部分生命周期的废弃. 此时作为开发者就很 ...
- 【阿菜用工具】利用 Web3.js 在 ganache 上部署以及调用智能合约
合约部署 要部署的合约 pragma solidity ^0.4.23; contract test { uint256 value; function setValue(uint256 _value ...
- vue使用GraphVis开发无限拓展的关系图谱
1.去GraphVis官网下载对应的js,新版和旧版的js有所不同,看自己需求引入旧版还是新版(GraphVis官方网址:http://www.graphvis.cn/) visgraph.min.j ...
- vue中rem的转换
1 function rems(doc: any, win: any): void { 2 let docEl = doc.documentElement, 3 resizeEvt = 'orient ...