《大话设计模式》--想走?可以!先买票--迭代器模式<Iterator>(20)
来源:互联网 发布:大学生找不到工作数据 编辑:程序博客网 时间:2024/06/07 17:44
I:提供一种方法顺序访问一个聚合对象中各个元素,而不暴露该对象的内部表示。
当你需要访问一个聚集对象,而且不管这些对象是什么都需要遍历的时候,你就应该考虑用迭代器模式。你需要对聚集有多种方式遍历时,可以考虑用迭代器模式。为遍历不同的聚集结构提供如开始、下一个、是否结束、当前哪一项等统一的接口。
abstract class Iterator { public abstract object First(); public abstract object Next(); public abstract bool IsDone(); public abstract object CurrentItem(); }
abstract class Aggregate { public abstract Iterator CreateIterator(); }
class ConcreteIterator:Iterator { private ConcreteAggregate aggregate; private int current = 0; public ConcreteIterator(ConcreteAggregate aggregate) { this.aggregate = aggregate; } public override object First() { return aggregate[0]; } public override object Next() { object obj = null; current++; if (current < aggregate.Count) { obj = aggregate[current]; } return obj; } public override bool IsDone() { return current >= aggregate.Count ? true : false; } public override object CurrentItem() { return aggregate[current]; } }
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); } } }
ConcreteAggregate aggregate = new ConcreteAggregate(); aggregate[0] = "大鸟"; aggregate[1] = "小菜"; aggregate[2] = "行李"; aggregate[3] = "老外"; aggregate[4] = "公交内部员工"; aggregate[5] = "小偷"; //Iterator i = new ConcreteIterator(aggregate); Iterator i = new ConcreteIteratorDesc(aggregate); object item = i.First(); while (!i.IsDone()) { Console.WriteLine(string.Format("{0} 请买票", i.CurrentItem())); i.Next(); }
以上代码是从前到后的迭代,如果我们需要从后往前迭代,则可添加如下类:
class ConcreteIteratorDesc:Iterator { private ConcreteAggregate aggregate; private int current = 0; public ConcreteIteratorDesc(ConcreteAggregate aggregate) { this.aggregate = aggregate; current = aggregate.Count - 1; } public override object First() { return aggregate[aggregate.Count - 1]; } public override object Next() { object obj = null; current--; if (current >= 0) { obj = aggregate[current]; } return obj; } public override object CurrentItem() { return aggregate[current]; } public override bool IsDone() { return current < 0 ? true : false; } }
.NET迭代器实现:
IList<string> iterator = new List<string>(); iterator.Add("大鸟"); iterator.Add("小菜"); iterator.Add("行李"); iterator.Add("老外"); iterator.Add("公交内部员工"); iterator.Add("小偷"); foreach (string item in iterator) { Console.WriteLine(string.Format("{0} 请买票", item)); }
迭代器模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可让外部代码透明地访问集合内部的数据。
0 0
- 《大话设计模式》--想走?可以!先买票--迭代器模式<Iterator>(20)
- 大话设计模式--第20章 想走?可以!先买票--迭代器模式
- 大话设计模式二十:迭代器模式(想走?可以,先买票)
- 《大话设计模式》—— 读后感(20)想走?可以!先买票——迭代器模式
- 设计模式:20 想走?可以!先买票_迭代器模式
- 第二十章想走可以先买票--迭代器模式(读书笔记)
- 大话设计模式20----迭代器模式
- 大话设计模式-迭代器模式
- 大话设计模式 迭代器模式
- 大话设计模式-迭代器模式
- 设计模式 -- Iterator(迭代器)
- Iterator(迭代器)设计模式
- Iterator 迭代器设计模式
- Iterator 迭代器设计模式
- 设计模式----Iterator(迭代器)模式
- 设计模式--迭代器模式(Iterator)
- [设计模式]Iterator迭代器模式
- 设计模式 迭代器模式 Iterator
- 日经春秋 20150612
- Installation error: INSTALL_PARSE_FAILED_MANIFEST_MALFORMED
- eclipse打开当前文件所在文件夹的两种方法
- SQL 笔记
- [leetcode] Implement Stack using Queues
- 《大话设计模式》--想走?可以!先买票--迭代器模式<Iterator>(20)
- 页面跳转两种方式
- 出现set_locale() failed (5): Input/output error的解决方法
- Spring官网下载dist.zip的几种方法
- 栈溢出崩溃排查(二)
- Images.xcassets
- postgresql表分区
- android 常用系统修改和设置
- Java环境配置