迭代器模式
来源:互联网 发布:ubuntu和ubuntu mate 编辑:程序博客网 时间:2024/06/05 06:27
故事:
一天,我去北京出游,上了公交车站,人很多很拥挤。
”上车的乘客买票了。”售票员一边在人缝中穿插,一边喊道。
“大爷,您的行李包太大了,需要买两张票。”售票员对一位大爷说。
“行李还需要买票?!它又不是个人。”大爷说,极不情愿地买了两张票。
“还有三位乘客没有买票。”售票员喊道。
“这售票员记性够好的啊,车上有多少人都记得,厉害!”我心想。
此时从人群接连递过来三块钱,票买齐了。售货员一边数着大把的钞票一边做到了自己的位置上。
故事就是这样的,售票员其实在做一件重要的事,就是把车厢里的所有人都遍历了一遍,不放过一个不买票的乘客。这就是一个设计模式的体现——迭代器模式
迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。
不管你上来的是人还是行李,只要是来乘车的乘客就必须要买票。同理,当你需要访问一个聚集对象,而且不管这些对象是什么都需要遍历的时候,你就应该考虑用迭代器模式。
另外,售票员从车头到车尾来售票,也可以从车尾向车头来售票,也就是说,你需要对聚集有多种方式遍历时,可以考虑用迭代器模式。
由于不管乘客是什么,售票员的做法始终是相同的,都是从第一个开始,下一个是谁,是否结束,当前售到哪个人了,这些方法每天他都在做,也就是说,为遍历不同的聚集结构提供如开始、下一个、是否结束、当前哪一项等统一的接口。
结构图如下:
具体代码如下:
Irator 迭代器抽象类
<span style="font-size:18px;">abstract class Aggregate { public abstract Iterator CreateIterator(); }</span>
Aggregate 聚集抽象类
<span style="font-size:18px;"> abstract class Aggregate { public abstract Iterator CreateIterator(); }</span>
ConcreteIterator具体迭代类,继承Iterator
<span style="font-size:18px;">class ConcreteIterator : Iterator { private ConcreteAggregate aggregate; //定义了一个具体聚集对象 int current = 0; public ConcreteIterator(ConcreteAggregate aggregate) { this.aggregate = aggregate; //初始化时将具体的聚集对象传入 } public override object First() { return aggregate[0]; //得到聚集的第一个对象 } public override object Next() { object ret = null; current++; if (current < aggregate.count) { ret = aggregate[current]; } return ret; } public override bool IsDone() { return current >= aggregate.count ? true : false; } public override object CurrentItem() { return aggregate[current]; //返回当前的聚集对象 } }</span>
ConcreteAggregate 具体聚集类 继承Aggregate
<span style="font-size:18px;">class ConcreteAggregate:Aggregate { private IList<object> items = new List<object>(); public override Iterator CreateIterator() { return new ConcreteIterator(this); } public int count { get { return items.Count; } //返回聚集总个数 } public object this[int index] { get { return items[index]; } set { items.Insert(index, value); } //声明一个索引器 } } </span>
客户端代码
<span style="font-size:18px;">static void Main(string[] args) { ConcreteAggregate a = new ConcreteAggregate(); a[0] = "我"; a[1] = "大爷"; a[2] = "行李"; Iterator i = new ConcreteIterator(a); object item = i.First(); while (!i.IsDone()) { Console.WriteLine("{0}请买车票!", i.CurrentItem()); i.Next(); } Console.Read(); } }</span>
总结:售票员真是一个迭代高手啊,每次有乘客上车他都数清楚人数,然后再对整车的乘客进行迭代遍历,不放过任何逃票的人。看来任何行业都有技巧和经验,需要多思考、多琢磨,才能做到最好。编程又何尝不是这样,我相信代码没有最好,只有更好,要继续努力!
0 0
- 行为模式-迭代器模式
- 设计模式-迭代器模式
- 设计模式 迭代器模式
- 设计模式-迭代器模式
- 设计模式--迭代器模式
- 【设计模式】迭代器模式
- 设计模式-迭代器模式
- 设计模式- 迭代器模式
- 设计模式 - 迭代器模式
- 设计模式:迭代器模式
- 行为模式-迭代器模式
- 设计模式 - 迭代器模式
- 设计模式-迭代器模式
- 设计模式--迭代器模式
- 设计模式---迭代器模式
- 设计模式---迭代器模式
- 【设计模式】迭代器模式
- 设计模式 迭代器模式
- 数据源,动态代理
- 各种编码UNICODE、UTF-8、ANSI、ASCII、GB2312、GBK详解
- onCreate()方法中获取View的宽高
- Android中Fragment的知识
- python定时器爬取豆瓣音乐Top榜歌名
- 迭代器模式
- 黑马程序员--完整的设计一个动画从开始到退出
- class struct关键字区别
- 黑马程序员--搭建界面,九宫格
- 重新开始拾起我的安卓之路,什么时候开始都不算晚!!!!
- Zookeeper 在Hadoop中的应用
- Android开发:GridView与ListView相互切换(动画效果)
- 黑马程序员--字典转模型
- Lua利用元表实现修饰器