博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[Head First设计模式]生活中学设计模式——迭代器模式
阅读量:5968 次
发布时间:2019-06-19

本文共 4022 字,大约阅读时间需要 13 分钟。

系列文章

迭代器模式

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

类图

角色

Iterator:定义访问和遍历元素的接口

Concretelterator:具体迭代器,实现迭代器接口,对该聚合遍历时跟踪当前位置。

Aggregate:聚合,定义创建相应迭代器对象的接口。

ConcreteAggregate:具体聚合,其工作是实现相应迭代器的接口,返回具体迭代器的一个适当的实例。

适用场景

1,访问一个聚合对象的内容而无需暴露它的内部表示

2,支持对聚合对象的多种遍历

3,为遍历不同的聚合结构提供一个统一的接口(即支持多态迭代)

优缺点

优点:

1,支持以不同的方式遍历一个聚合

2,简化了聚合的接口

3,可同时进行多个遍历

缺点:

和集合密切相关,限制了其广泛使用。

一个例子

公共汽车售票员工作的场景:

售票员不管上来的是人还是行李,不管是中国人还是外国人,不管是内部员工还是别的,只要是来乘车的乘客,就必须要买票。也就是说,当我们需要访问一个聚集对象,而且不管这些对象是什么都需要遍历的时候,就应该考虑用迭代模式。

另外,售票员从车头到车尾来售票,也可以从车尾向车头来售票,也就是说,当我们需要对聚集有很多种方式遍历时,可以考虑用迭代器模式。

由于不管乘客是什么,售票员的做法始终是相同的,都是从第一个开始,下一个,是否结束,当前售到那一个人,这些方法每天他都在做,也就是说,当遍历不同的聚集结构提供如开始、下一个、是否结束、当前哪一项等统一的过程,可以考虑使用迭代器模式。

 这里使用IEnumerator,.net中的迭代器接口

1 namespace System.Collections 2 { 3     // 摘要:  4     //     支持对非泛型集合的简单迭代。 5     [ComVisible(true)] 6     [Guid("496B0ABF-CDEE-11d3-88E8-00902754C43A")] 7     public interface IEnumerator 8     { 9         // 摘要: 10         //     获取集合中的当前元素。11         //12         // 返回结果: 13         //     集合中的当前元素。14         object Current { get; }15 16         // 摘要: 17         //     将枚举数推进到集合的下一个元素。18         //19         // 返回结果: 20         //     如果枚举数成功地推进到下一个元素,则为 true;如果枚举数越过集合的结尾,则为 false。21         //22         // 异常: 23         //   System.InvalidOperationException:24         //     在创建了枚举数后集合被修改了。25         bool MoveNext();26         //27         // 摘要: 28         //     将枚举数设置为其初始位置,该位置位于集合中第一个元素之前。29         //30         // 异常: 31         //   System.InvalidOperationException:32         //     在创建了枚举数后集合被修改了。33         void Reset();34     }35 }

Concretelterator:具体迭代器,实现迭代器接口,对该聚合遍历时跟踪当前位置。

1 namespace Wolfy.迭代器模式 2 { 3     public class Concretelterator : IEnumerator 4     { 5         private ConcreteAggregate aggregate; 6        private  int currentIndex=-1; 7         public Concretelterator(ConcreteAggregate aggregate) 8         { 9             this.aggregate = aggregate;10         }11         public object Current12         {13             get { return aggregate[currentIndex]; }14         }15 16         public bool MoveNext()17         {18             currentIndex++;19             return currentIndex < this.aggregate.Count;20            21         }22 23         public void Reset()24         {25             currentIndex = -1;26         }27     }28 }
1 namespace Wolfy.迭代器模式2 {3     public abstract class Aggregate4     {5         public abstract IEnumerator CreateEnumerator();6     }7 }

ConcreteAggregate:具体聚合,其工作是实现相应迭代器的接口,返回具体迭代器的一个适当的实例。

1 namespace Wolfy.迭代器模式 2 { 3     public class ConcreteAggregate : Aggregate 4     { 5         private  ArrayList arr=new ArrayList(); 6         public int Count 7         { 8             get { return arr.Count; } 9         }10         public object this[int index]11         {12             get { return arr[index]; }13             set { arr.Insert(index, value); }14         }15         public override System.Collections.IEnumerator CreateEnumerator()16         {17             return new Concretelterator(this);18         }19     }20 }

测试

1 namespace Wolfy.迭代器模式 2 { 3     class Program 4     { 5         static void Main(string[] args) 6         { 7  8             ConcreteAggregate agg = new ConcreteAggregate(); 9             agg[0] = "乘客1";10             agg[1] = "乘客2";11             agg[2] = "乘客3";12             agg[3] = "乘客4";13             agg[4] = "乘客5";14             agg[5] = "乘客6";15             agg[6] = "乘客7";16             agg[7] = "乘客8";17             agg[8] = "乘客9";18             agg[9] = "乘客10";19             IEnumerator iterator =agg.CreateEnumerator();20             while (iterator.MoveNext())21             {22                 Console.WriteLine(iterator.Current);23             }24             iterator.Reset();25             Console.Read();26         }27     }28 }

结果:

总结

这个模式给你提供了一种方法,可以顺序访问一个聚集对象中的元素,而又不用知道内部是如何表示的。

参考书:

《Head First 设计模式》

博客地址:
博客版权: 本文以学习、研究和分享为主,欢迎转载,但必须在文章页面明显位置给出原文连接。
如果文中有不妥或者错误的地方还望高手的你指出,以免误人子弟。如果觉得本文对你有所帮助不如【推荐】一下!如果你有更好的建议,不如留言一起讨论,共同进步!
再次感谢您耐心的读完本篇文章。
转载:http://www.cnblogs.com/wolf-sun/p/3633600.html
你可能感兴趣的文章
py requests.post2
查看>>
批处理文件学习笔记
查看>>
[考试]20151008
查看>>
perf-perf stat用户层代码分析
查看>>
OSI七层与TCP/IP五层网络架构详解
查看>>
(转载)equals与==
查看>>
shell
查看>>
Centos防火墙添加IP白名单
查看>>
LeetCode - Backspace String Compare
查看>>
namespace用法
查看>>
MySQL 5.7原生JSON格式支持
查看>>
[吴恩达机器学习笔记]14降维3-4PCA算法原理
查看>>
Solr分词
查看>>
RxJava学习(四利用RxJava打造自己的RxBus)
查看>>
洛谷 P1313 计算系数 Label:杨辉三角形 多项式计算
查看>>
Java单例模式之最优解分析【为何说是最优解】
查看>>
C#中的程序集和命名空间
查看>>
es6语法总结-解构赋值
查看>>
Algorithms-Part1最后一周的作业——KdTree
查看>>
Leetcode 19. Remove Nth Node From End of List
查看>>