系列文章

[Head First设计模式]山西面馆中的设计模式——装饰者模式

[Head First设计模式]山西面馆中的设计模式——观察者模式

[Head First设计模式]山西面馆中的设计模式——建造者模式

[Head First设计模式]饺子馆(冬至)中的设计模式——工厂模式

[Head First设计模式]一个人的平安夜——单例模式

[Head First设计模式]抢票中的设计模式——代理模式

[Head First设计模式]面向对象的3特征5原则

[Head First设计模式]鸭子模型——策略模式

[Head First设计模式]云南米线馆中的设计模式——模版方法模式

[Head First设计模式]餐馆中的设计模式——命令模式

[Head First设计模式]身边的设计模式——适配器模式

迭代器模式

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

类图

角色

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 Current
12         {
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 Aggregate
4     {
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/
博客版权: 本文以学习、研究和分享为主,欢迎转载,但必须在文章页面明显位置给出原文连接。
如果文中有不妥或者错误的地方还望高手的你指出,以免误人子弟。如果觉得本文对你有所帮助不如【推荐】一下!如果你有更好的建议,不如留言一起讨论,共同进步!
再次感谢您耐心的读完本篇文章。

转载:http://www.cnblogs.com/wolf-sun/p/3633600.html

[Head First设计模式]生活中学设计模式——迭代器模式相关推荐

  1. [Head First设计模式]生活中学设计模式——组合模式

    系列文章 [Head First设计模式]山西面馆中的设计模式--装饰者模式 [Head First设计模式]山西面馆中的设计模式--观察者模式 [Head First设计模式]山西面馆中的设计模式- ...

  2. 《Head first设计模式》学习笔记 – 迭代器模式

    迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示. 爆炸性新闻:对象村餐厅和对象村煎饼屋合并了! 真是个好消息!现在我们可以在同一个地方,享用煎饼屋美味的煎饼早餐,和好吃 ...

  3. C#设计模式之十五迭代器模式(Iterator Pattern)【行为型】

    一.引言 今天我们开始讲"行为型"设计模式的第三个模式,该模式是[迭代器模式],英文名称是:Iterator Pattern.还是老套路,先从名字上来看看."迭代器模式& ...

  4. 大战设计模式【12】—— 迭代器模式

    迭代器模式(Iterator) 设计模式使用的例子https://github.com/LinkinStars/DesignPatternsAllExample 一.定义 提供一种方法顺序访问一个聚合 ...

  5. 设计模式笔记十七:迭代器模式

    原文:http://www.runoob.com/design-pattern/ 少许个人理解,如有错误请指出.欢迎一起讨论. 迭代器模式(Iterator Pattern) 是 Java 和 .Ne ...

  6. 设计模式之禅【迭代器模式】

    真刀实枪之迭代器模式 从整理项目说起 老板要看项目,但是有点乱,让我整理下,简单,说干就干 类图先上 代码跟上 IProject package com.peng.ddq;/*** @author k ...

  7. 结合项目实例 回顾传统设计模式(九)迭代器模式

    关于迭代器模式,我们所需要知道的第一件事情就是它依赖于一个名为迭代器的接口.一旦我们有了这个接口,就可以为各种那个对象集合实现迭代器:数组.列表.散列表. 项目实例我们就拿用户角色模块来举例 背景 1 ...

  8. 设计模式的理解:迭代器模式(Iterator)

    迭代器模式,又称游标模式,提供一种方法顺序访问一个集合对象中的各个元素,而又不需要暴露该对象的内部表示. template<typename T> class Iterator{publi ...

  9. PHP设计模式(6)迭代器模式

    迭代器(Iterator)模式,在一个很常见的过程上提供了一个抽象:位于对象图不明部分的一组对象(或标量)集合上的迭代. 迭代有几种不同的具体执行方法:在数组属性,集合对象,数组,甚至一个查询结果集之 ...

最新文章

  1. oracle database link使用说明
  2. python内置函数open_Python的内置函数open()的注意事项
  3. ASP.net:命名空间“System.Xml”中不存在类型(是缺少程序集引用吗?)
  4. qtextedit非编辑时去边框_Photoshop玩腻了!这10个图形编辑神器你知道吗
  5. 递归 遍历目录下的所有文件
  6. mongodb分页优化
  7. 2、http网络编程——libcurl的使用
  8. Document Star证件照大师升级版 for Mac(支持ps2021)
  9. 【java集合框架源码剖析系列】java源码剖析之TreeSet
  10. 我心中接地气的大数据【前言】
  11. 科大讯飞AIUI-应用集成6麦解决方案
  12. 计算机的文档库在哪哪里,电脑的word文档在哪里
  13. 世纪安图参加2014地理信息开发者大会
  14. 开机提示小娜无法在本计算机运行,win10 20h2提示此应用无法在你的电脑上运行解决方法...
  15. 如何做好一名游戏测试工程师
  16. Spring Cloud(十一):Hystrix服务熔断-工作流程
  17. 安装Ubuntu13.10后的首要事情
  18. GLES2.0中文API-glUniform
  19. HNUCM-XP的点滴(水题)
  20. 【02】2022.11最新超详细Vuforia图片识别教程

热门文章

  1. 该如何继续走下去。。
  2. 鸟哥的Linux私房菜基础学习篇(第二版)第十二章课后习题与答案
  3. 如何不让右下角出现“windows安全报警”
  4. ajax async:false不管用_js 网络请求框架 ajax和axios、fetch的区别
  5. 软件工程结构化建模的方法和工具_2020年6月——北京大学《软件工程》笔记
  6. 内存管理-定时器循环、内存布局、tagged pointer、weak指针、copy、自动释放池
  7. ANDROID_NDK的path,如何在Android Studio中设置NDK_PROJECT_PATH
  8. ping通网关不能上网_手机、电脑为什么连不上网(断网)?
  9. Web后门工具WeBaCoo
  10. .net 集合分成几个等数量集合_如果不想下载软件,那就看一下这几个网站吧