什麼是迭代器模式? 迭代器模式(Iterator):提供一種方法順序訪問一個聚合對象中各個元素,而又不暴露該對象的內部表示。 何時使用迭代器模式? 當需要訪問一個聚合對象,而且不管這些對象是什麼都需要遍歷的時候,需要考慮使用迭代器模式。 迭代器模式的組成 Iterator:迭代器抽象類,用於定義得到 ...
什麼是迭代器模式?
迭代器模式(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
備註:文中所有代碼及知識點均來自於《大話設計模式》,本人屬於邊學邊看邊敲代碼邊總結的階段。