C#迭代器模式分析

开发 后端
这里介绍C#迭代器模式,以前的客户程序过多的关注了List内部实现的细节,所以不能很好的移植。而C#迭代器模式就是为解决这个问题而生的。

C#迭代器有很多值得学习的地方,这里我们主要介绍C#迭代器模式,包括介绍ICollection负责数据存储等方面。

提到C#迭代器我们不能不想到C#迭代器模式,那我就以C#迭代器模式作为开场白。

在我们的应用程序中常常有这样一些数据结构:

它们是一个数据的集合,如果你知道它们内部的实现结构就可以去访问它们,它们各自的内部存储结构互不相同,各种集合有各自的应用场合.说到这里大家可能想出一大堆这样的集合了:List,Hashtable,ArrayList等等。这些集合各自都有各自的个性,这就是它们存在的理由。但如果你想遍历它你必须知道它内部的存储细节,作为一个集合元素,把内部细节暴露出来肯定就不好了,这样客户程序就不够稳定了,在你更换集合对象的时候,比如List 不能满足需求的时候,你换成Hashtable,因为以前的客户程序过多的关注了List内部实现的细节,所以不能很好的移植。而C#迭代器模式就是为解决这个问题而生的:

提供一种一致的方式访问集合对象中的元素,而无需暴露集合对象的内部表示。

比如现在有这样一个需求,遍历集合内的元素,然后输出,但是并不限定集合是什么类型的集合,也就是未来集合可能发生改变。

思考:

集合会发生改变,这是变化点,集合改变了,遍历方法也改变,我们要保证遍历的方法稳定,那么就要屏蔽掉细节。找到了变化点那我们就将其隔离起来(一般使用interface作为隔离手段):假设所有的集合都继承自ICollection接口,这个接口用来隔离具体集合的,将集合屏蔽在接口后面,作为遍历我们肯定需要这样一些方法:MoveNext,Current,既然ICollection负责数据存储,职责又要单一,那么就新建立一个接口叫做 Iterator吧,每种具体的集合都有自己相对应的Iterator实现:

  1. public interface ICollection  
  2. {  
  3. int Count { get; }  
  4. ///   
  5. /// 获取迭代器  
  6. ///   
  7. /// 迭代器  
  8. Iterator GetIterator();  
  9. }  
  10. ///   
  11. /// 迭代器接口  
  12. ///   
  13. public interface Iterator  
  14. {  
  15. bool MoveNext();  
  16.  
  17. object Current { get; }  
  18. }  
  19.  
  20. public class List : ICollection  
  21. {  
  22. private const int MAX = 10;  
  23. private object[] items;  
  24. public List()  
  25. {   
  26. items = new object[MAX];  
  27. }  
  28. public object this[int i]  
  29. {  
  30. get { return items[i]; }  
  31. set { this.items[i] = value; }  
  32. }  
  33. #region ICollection Members  
  34.  
  35. public int Count  
  36. {  
  37. get { return items.Length; }  
  38. }  
  39.  
  40. public Iterator GetIterator()  
  41. {  
  42. return new ListIterator(this);  
  43. }  
  44.  
  45. #endregion  
  46. }  
  47. public class ListIterator : Iterator  
  48. {  
  49. private int index = 0;  
  50. private ICollection list;  
  51. public ListIterator(ICollection list)  
  52. {  
  53. this.list = list;  
  54. index = 0;  
  55. }  
  56. #region Iterator Members  
  57.  
  58. public bool MoveNext()  
  59. {  
  60. if (index + 1 > list.Count)  
  61. return false;  
  62. else  
  63. {   
  64. index++;  
  65. return true;  
  66. }  
  67. }  
  68.  
  69. public object Current  
  70. {  
  71. get { return list[index]; }  
  72. }  
  73.  
  74. #endregion  
  75. }  
  76. ///   
  77. /// 测试  
  78. ///   
  79. public class Program  
  80. {  
  81. static void Main()  
  82. {  
  83. ICollection list = new List();  
  84. Iterator iterator = list.GetIterator();  
  85. while (iterator.MoveNext())  
  86. {  
  87. object current = iterator.Current;  
  88. }  
  89. }  

【编辑推荐】

  1. C# lock关键字叙述
  2. C#.Net FrameWork简介
  3. C# new和override简单描述
  4. C#值类型和引用类型浅谈
  5. C#标识符简单分析
责任编辑:佚名 来源: IT168
相关推荐

2009-08-11 13:59:41

迭代器模式C# Iterator

2009-08-19 15:18:53

迭代器

2009-08-26 16:37:07

C#迭代器局部变量

2009-08-31 16:01:31

C#和设计模式

2013-03-15 10:37:08

C#

2021-06-22 15:27:13

设计模式迭代器模式Java

2010-04-29 08:53:11

PHP迭代器模式

2020-11-06 09:01:46

迭代器模式

2023-11-07 10:10:36

设计模式元素

2009-08-31 16:12:02

C#使用Singlet

2009-08-26 10:24:04

C# Observer

2009-08-19 11:21:02

C# ListBox控

2009-08-26 16:46:06

C# ThreadSt

2009-08-27 13:27:50

C# this保留字

2009-09-01 09:16:57

C#使用SharpZi

2009-08-26 10:34:59

C# Hashtabl

2009-08-04 09:22:26

C#工厂模式

2009-08-31 15:48:02

C# Singleto

2009-08-25 18:04:30

C#实现Singlet

2009-09-02 16:23:27

C# Singleto
点赞
收藏

51CTO技术栈公众号