C#学习笔记-迭代器模式
什么是迭代器模式?
迭代器模式(Iterator):提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。
何时使用迭代器模式?
当需要访问一个聚合对象,而且不管这些对象是什么都需要遍历的时候,需要考虑使用迭代器模式。
迭代器模式的组成
Iterator()
:迭代器抽象类,用于定义得到开始对象,对到下一个对象,判断是否到结尾,当前对象等抽象方法,统一接口。
ConcreteAggregate()
:保存聚合对象。
ConcreteIterator()
:继承于Iterator,实现具体如何对聚合对象的操作。
迭代器模式具体实现
迭代器模式的结构
迭代器模式的实现:
Iterator:
1 abstract class Iterator 2 { 3 public abstract object First(); 4 public abstract object Next(); 5 public abstract bool IsDone(); 6 public abstract object CurrentItem(); 7 }
ConcreteIterator:
1 //顺序遍历 2 class ConcreteIterator : Iterator 3 { 4 private ConcreteAggregate aggregate; 5 private int current = 0; 6 //将现在的数据组传输进来 7 public ConcreteIterator(ConcreteAggregate aggregate) 8 { 9 this.aggregate = aggregate; 10 } 11 public override object CurrentItem() 12 { 13 return aggregate[current]; 14 } 15 16 public override object First() 17 { 18 return aggregate[0]; 19 } 20 21 public override bool IsDone() 22 { 23 return current >= aggregate.Count ? true : false; 24 } 25 26 public override object Next() 27 { 28 object obj = null; 29 current++; 30 if (current < aggregate.Count) 31 { 32 obj = aggregate[current]; 33 } 34 return obj; 35 } 36 } 37 //逆序遍历 38 class ConcreteIteratorDesc : Iterator 39 { 40 private ConcreteAggregate aggregate; 41 private int current = 0; 42 //传输数据进来 43 public ConcreteIteratorDesc(ConcreteAggregate aggregate) 44 { 45 this.aggregate = aggregate; 46 current = aggregate.Count - 1; 47 } 48 public override object CurrentItem() 49 { 50 return aggregate[current]; 51 } 52 53 public override object First() 54 { 55 return aggregate[aggregate.Count - 1]; 56 } 57 58 public override bool IsDone() 59 { 60 return current < 0 ? true:false; 61 } 62 63 public override object Next() 64 { 65 object obj = null; 66 current--; 67 if (current >= 0) 68 { 69 obj = aggregate[current]; 70 } 71 return obj; 72 } 73 }
ConcreteAggregate:
1 /// <summary> 2 /// 创建迭代器 3 /// 在这里看并没有什么具体的用处 4 /// </summary> 5 abstract class Aggregate 6 { 7 public abstract Iterator CreateIterator(); 8 } 9 10 /// <summary> 11 /// 作用是保存数据,保存的数据是一系列数据,所以用数组 12 /// 然后传输数据给ConcreteIterator 13 /// </summary> 14 class ConcreteAggregate : Aggregate 15 { 16 //用于存放聚合对象 17 private IList<object> items = new List<object>(); 18 public override Iterator CreateIterator() 19 { 20 return new ConcreteIterator(this); 21 } 22 //数组的长度,也就是ConcreteAggregate的属性 23 public int Count { get { return items.Count; } } 24 /// ConcreteAggregate现在是数组形式 25 /// get获取当前的数据 26 /// set将新来的数据插入到ConcreteAggregate中 27 public object this[int index] 28 { 29 get { return items[index]; } 30 set { items.Insert(index, value); } 31 } 32 }
主函数调用:
1 static void Main(string[] args) 2 { 3 ConcreteAggregate a = new ConcreteAggregate(); 4 a[0] = "A"; 5 a[1] = "B"; 6 a[2] = "C"; 7 a[3] = "D"; 8 a[4] = "E"; 9 a[5] = "F"; 10 11 Iterator i = new ConcreteIterator(a); 12 object item = i.First(); 13 while (!i.IsDone()) 14 { 15 Console.WriteLine("{0} buy ticket,please", i.CurrentItem()); 16 i.Next(); 17 } 18 19 Iterator id = new ConcreteIteratorDesc(a); 20 object itemdec = id.First(); 21 while (!id.IsDone()) 22 { 23 Console.WriteLine("{0} buy ticket,please", id.CurrentItem()); 24 id.Next(); 25 } 26 27 Console.Read(); 28 }
.NET的迭代器实现
迭代器模式在我们现在的使用中其实没有那么麻烦,因为.NET框架已经准备好了相关的接口,只需要实现就好了。
1 static void Main(string[] args) 2 { 3 IList<string> a = new List<string>(); 4 5 a.Add("A"); 6 a.Add("B"); 7 a.Add("C"); 8 a.Add("D"); 9 a.Add("E"); 10 a.Add("F"); 11 12 //看见遍历首先考虑foreach 13 foreach (string item in a) 14 { 15 Console.WriteLine("{0} buy ticket,please", item); 16 } 17 //支持在泛型集合上进行简单迭代。 18 IEnumerator<string> e = a.GetEnumerator(); 19 while (e.MoveNext()) 20 { 21 Console.WriteLine("{0} buy ticket,please", e.Current); 22 } 23 24 Console.Read(); 25 }
补充:IEnumerator
备注:文中所有代码及知识点均来自于《大话设计模式》,本人属于边学边看边敲代码边总结的阶段。
作者:可达鸭要进化
出处:http://www.cnblogs.com/Aries-rong/
本文版权归作者和博客园共有,欢迎转载,但是未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。