经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » 设计模式 » 查看文章
通俗易懂设计模式解析——迭代器模式
来源:cnblogs  作者:小世界的野孩子  时间:2019/10/11 9:18:17  对本文有异议

前言

  今天我们一起看看行为模式中的迭代器模式,迭代是重复反馈过程的活动,其目的通常是为了接近并到达所需的目标或结果。在系统开发中简单说可以理解成遍历。这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层或者内部表示。

迭代器模式介绍

一、来由

  在系统开发中,集合对象内部表示各不相同。底层构造也尽不相同。对于这些对象,我们希望在不暴露其底层和内部表示的同时,可以使外部客户访问其中元素。迭代器模式就为这一需求提供了极其优雅的实现。

二、意图

  提供一种方法顺序访问一个聚合对象中各个元素, 而又无须暴露该对象的内部表示。

三、案例图

 

四、迭代器模式代码示例

我们从上面的案例图可见,迭代器模式主要包含以下四个部分:

抽象迭代器:定义了访问和遍历元素的接口,然后在其子类中实现这些方法。

具体迭代器:实现抽象迭代器接口,完成对集合对象的遍历。同时对遍历时的位置进行跟踪。

抽象聚合类:主要用于储存对象,创建相应的迭代器对象的接口。带有一个createIterator()方法用于创建迭代器对象。

具体聚合类:实现创建相应的迭代器对象的接口,实现createIterator()方法,并且返回与该具体聚合相对应的具体迭代器ConcreteIterator实例。

介绍完迭代器模式之后,接下来我们具体来看看迭代器模式的具体实现吧。具体如下:

 

  1. namespace Iterator_Pattern
  2. {
  3. class IteratorPattern
  4. {
  5. }
  6. /// <summary>
  7. /// 抽象聚合类、包含一个创建迭代器对象的方法
  8. /// </summary>
  9. public interface IListAggregate
  10. {
  11. Iterator GetIterator();
  12. }
  13. /// <summary>
  14. /// 抽象迭代器、包含访问和遍历元素的方法
  15. /// </summary>
  16. public interface Iterator
  17. {
  18. /// <summary>
  19. /// 是否有下一个元素
  20. /// </summary>
  21. /// <returns></returns>
  22. bool IsNext();
  23. /// <summary>
  24. /// 获取当前元素位置
  25. /// </summary>
  26. /// <returns></returns>
  27. object GetCurrentIndex();
  28. /// <summary>
  29. /// 获取下一个元素
  30. /// </summary>
  31. void Next();
  32. /// <summary>
  33. /// 获取第一个元素、相当于重置
  34. /// </summary>
  35. void Start();
  36. }
  37. /// <summary>
  38. /// 具体聚合类
  39. /// </summary>
  40. public class ConcreteListAggregate : IListAggregate
  41. {
  42. string[] list;
  43. public ConcreteListAggregate()
  44. {
  45. list = new string[] { "张三", "李四", "王五", "赵六" };
  46. }
  47. /// <summary>
  48. /// 创建迭代器对象
  49. /// </summary>
  50. /// <returns></returns>
  51. public Iterator GetIterator()
  52. {
  53. return new ConcreteIterator(this);
  54. }
  55. /// <summary>
  56. /// 获取对象长度
  57. /// </summary>
  58. public int Length
  59. {
  60. get { return list.Length; }
  61. }
  62. /// <summary>
  63. /// 获取指定位置元素
  64. /// </summary>
  65. /// <param name="index"></param>
  66. /// <returns></returns>
  67. public object GetItem(int index)
  68. {
  69. return list[index];
  70. }
  71. }
  72. public class ConcreteIterator : Iterator
  73. {
  74. private ConcreteListAggregate _list;
  75. private int _index;
  76. public ConcreteIterator(ConcreteListAggregate list)
  77. {
  78. _list = list;
  79. _index = 0;
  80. }
  81. public object GetCurrentIndex()
  82. {
  83. return _list.GetItem(_index);
  84. }
  85. public bool IsNext()
  86. {
  87. if (_index<_list.Length)
  88. {
  89. return true;
  90. }
  91. return false;
  92. }
  93. public void Next()
  94. {
  95. if (_index<_list.Length)
  96. {
  97. _index++;
  98. }
  99. }
  100. public void Start()
  101. {
  102. _index = 0;
  103. }
  104. }
  105. }

 

  1. namespace Iterator_Pattern
  2. {
  3. class Program
  4. {
  5. static void Main(string[] args)
  6. {
  7. //获取迭代器对象
  8. IListAggregate listAggregate = new ConcreteListAggregate();
  9. Iterator iterator = listAggregate.GetIterator();
  10. while (iterator.IsNext())
  11. {
  12. var result = iterator.GetCurrentIndex();
  13. Console.WriteLine(result);
  14. iterator.Next();
  15. }
  16. }
  17. }
  18. }

 

使用场景及优缺点

一、使用场景

1、访问聚合对象的内容不需要暴露其内部表示。

2、需要为聚合对象提供多种遍历方式。

3、为了遍历不同的聚合结构对象提供统一的接口

二、优点

1、访问聚合对象内容时无需暴露其内部表示。

2、迭代器模式为不同的聚合结构对象提供了统一的接口。

3、在同一个聚合对象上可以实现多种遍历。

4、增加新的聚合类和迭代类较为方便,无需修改之前的代码

三、缺点

1迭代器模式将存储数据和遍历数据的责任进行了分离。增加新的聚合类型的时候需要增加新的迭代器类。存在成对增加的。增加了系统的复杂性。

总结

  迭代器模式到这里就介绍完了。迭代器模式就是通过迭代器类将集合对象的遍历行为进行区分开来。这样一来就可以不暴露集合对象的内部表示了。又可以使外部能正常的使用访问其元素。这个模式并不复杂。把握好其中每个角色的职责,进行连贯就好了。在.Net中我们也可以发现一个现成的迭代器模式。这也是最好的教程案例。IEnumerable作为了一个抽象聚合类、IEnumerator作为一个抽象迭代器。在System.Collections命名空间之下。有兴趣深究的可以去研究下。

 


    一个人如若不能使自己的人生辉煌,但也没有理由使它黯淡;人生可以平凡,但不可以庸俗、堕落;人生不在乎掠取多少,而在于追求过程的完美与卓越!

     C#设计模式系列目录

     欢迎大家扫描下方二维码,和我一起踏上设计模式的闯关之路吧!

  

 

原文链接:http://www.cnblogs.com/hulizhong/p/11641998.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号