• 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. }  
    90. }
  • 相关阅读:
    linux基本命令
    Charles抓包
    html5基础知识
    java流程控制
    Harry Potter and the sorcerer's stone-01 the Boy Who Lived
    java基础知识
    Java程序运行机制
    java基础相关(历史,特性,环境变量)
    markdown基本语法
    Dos相关知识
  • 原文地址:https://www.cnblogs.com/MrLi/p/2935199.html
Copyright © 2020-2023  润新知