[Head First设计模式]生活中学设计模式——迭代器模式
系列文章
[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设计模式]生活中学设计模式——迭代器模式相关推荐
- [Head First设计模式]生活中学设计模式——组合模式
系列文章 [Head First设计模式]山西面馆中的设计模式--装饰者模式 [Head First设计模式]山西面馆中的设计模式--观察者模式 [Head First设计模式]山西面馆中的设计模式- ...
- 《Head first设计模式》学习笔记 – 迭代器模式
迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示. 爆炸性新闻:对象村餐厅和对象村煎饼屋合并了! 真是个好消息!现在我们可以在同一个地方,享用煎饼屋美味的煎饼早餐,和好吃 ...
- C#设计模式之十五迭代器模式(Iterator Pattern)【行为型】
一.引言 今天我们开始讲"行为型"设计模式的第三个模式,该模式是[迭代器模式],英文名称是:Iterator Pattern.还是老套路,先从名字上来看看."迭代器模式& ...
- 大战设计模式【12】—— 迭代器模式
迭代器模式(Iterator) 设计模式使用的例子https://github.com/LinkinStars/DesignPatternsAllExample 一.定义 提供一种方法顺序访问一个聚合 ...
- 设计模式笔记十七:迭代器模式
原文:http://www.runoob.com/design-pattern/ 少许个人理解,如有错误请指出.欢迎一起讨论. 迭代器模式(Iterator Pattern) 是 Java 和 .Ne ...
- 设计模式之禅【迭代器模式】
真刀实枪之迭代器模式 从整理项目说起 老板要看项目,但是有点乱,让我整理下,简单,说干就干 类图先上 代码跟上 IProject package com.peng.ddq;/*** @author k ...
- 结合项目实例 回顾传统设计模式(九)迭代器模式
关于迭代器模式,我们所需要知道的第一件事情就是它依赖于一个名为迭代器的接口.一旦我们有了这个接口,就可以为各种那个对象集合实现迭代器:数组.列表.散列表. 项目实例我们就拿用户角色模块来举例 背景 1 ...
- 设计模式的理解:迭代器模式(Iterator)
迭代器模式,又称游标模式,提供一种方法顺序访问一个集合对象中的各个元素,而又不需要暴露该对象的内部表示. template<typename T> class Iterator{publi ...
- PHP设计模式(6)迭代器模式
迭代器(Iterator)模式,在一个很常见的过程上提供了一个抽象:位于对象图不明部分的一组对象(或标量)集合上的迭代. 迭代有几种不同的具体执行方法:在数组属性,集合对象,数组,甚至一个查询结果集之 ...
最新文章
- oracle database link使用说明
- python内置函数open_Python的内置函数open()的注意事项
- ASP.net:命名空间“System.Xml”中不存在类型(是缺少程序集引用吗?)
- qtextedit非编辑时去边框_Photoshop玩腻了!这10个图形编辑神器你知道吗
- 递归 遍历目录下的所有文件
- mongodb分页优化
- 2、http网络编程——libcurl的使用
- Document Star证件照大师升级版 for Mac(支持ps2021)
- 【java集合框架源码剖析系列】java源码剖析之TreeSet
- 我心中接地气的大数据【前言】
- 科大讯飞AIUI-应用集成6麦解决方案
- 计算机的文档库在哪哪里,电脑的word文档在哪里
- 世纪安图参加2014地理信息开发者大会
- 开机提示小娜无法在本计算机运行,win10 20h2提示此应用无法在你的电脑上运行解决方法...
- 如何做好一名游戏测试工程师
- Spring Cloud(十一):Hystrix服务熔断-工作流程
- 安装Ubuntu13.10后的首要事情
- GLES2.0中文API-glUniform
- HNUCM-XP的点滴(水题)
- 【02】2022.11最新超详细Vuforia图片识别教程
热门文章
- 该如何继续走下去。。
- 鸟哥的Linux私房菜基础学习篇(第二版)第十二章课后习题与答案
- 如何不让右下角出现“windows安全报警”
- ajax async:false不管用_js 网络请求框架 ajax和axios、fetch的区别
- 软件工程结构化建模的方法和工具_2020年6月——北京大学《软件工程》笔记
- 内存管理-定时器循环、内存布局、tagged pointer、weak指针、copy、自动释放池
- ANDROID_NDK的path,如何在Android Studio中设置NDK_PROJECT_PATH
- ping通网关不能上网_手机、电脑为什么连不上网(断网)?
- Web后门工具WeBaCoo
- .net 集合分成几个等数量集合_如果不想下载软件,那就看一下这几个网站吧