標籤:設計模式 迭代器
迭代器模式定義:提供一種方法順序的訪問一組彙總元素,而又不暴露該對象的內部結構。
說明:首先說明,使用迭代器的對象必須是一組彙總對象,比如公交車就是一組彙總對象,車內的人互相之間可能有關係,可能沒關係,他們組合起來組成了這個彙總對象。並且,這個順序可以是任何順序,比如從大到小,或者從小到大,也就是說迭代器迭代一個對象時,下一個對象已經確定了,這個而對象是唯一的。最後就是內部結構,其實我們只是從外部可以得到這個對象的值,但是彙總對象內部的構造,我們是不清楚的。
迭代器類圖:
代碼實現:
class Program { static void Main(string[] args) { ConcreteAggregate a = new ConcreteAggregate(); //公交車,即聚集對象 a[0] = "大鳥"; //新上來的乘客,即對象組 a[1] = "小菜"; a[2] = "行李"; a[3] = "老外"; a[4] = "內部員工"; a[5] = "小偷"; a[6] = "體制內人員"; Iterator i = new ConcreteIterator(a); //售票員出場,先看好那些人上車,即申明迭代器對象 object item = i.First(); //從第一個人開始 while (!i.IsDone()) //判斷是否買票 { Console.WriteLine("{0}請買車票", i.CurrentItem ()); //讓當前對象買票 i.Next(); //下一個乘客 } Console.Read(); } } abstract class Iterator //迭代器抽象類別、介面 { public abstract object First(); //定義開始對象 public abstract object Next(); //下一個對象 public abstract bool IsDone(); //判斷是否到結尾 public abstract object CurrentItem(); //當前對象 } 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 ret = null; current++; if (current < aggregate.Count) { ret = aggregate[current ]; } return ret; } public override bool IsDone() //判斷是否便利到結尾,結尾時返回TRUE { return current >= aggregate.Count ? true : false; } public override object CurrentItem() //返回當前的聚集對象 { return aggregate[current ]; } } abstract class Aggregate //聚集抽象類別 { public abstract Iterator CreateIterator(); //建立迭代器 } class ConcreteAggregate : Aggregate { private IList <object > items = new List<object >(); //生命一個IList泛型變數,用於存放彙總對象,用ArrayList也可以實現 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 ); } } }
因為迭代器在編程中泰常見了,所以進階語言將迭代器進行了高度的抽象,比如說數組、ArryList、集合、雜湊表、字典都進行了封裝,所以我們平時並不會注意到這個模式。
接下來看看.net內建的迭代器。
class Program { static void Main(string[] args) { IList<string > a = new List<string > (); a.Add("大鳥"); a.Add("小菜"); a.Add("行李"); a.Add("老外"); a.Add("體制內人員"); a.Add("員工"); a.Add("小偷"); foreach (string item in a) { Console.WriteLine("{0}請買車票", item); } Console.Read(); } } public interface IEumerator { object Current //擷取集合中的當前元素 { get; } bool MoveNext(); //將枚舉進行到集合中的下一個元素。用bool值標記。 void Reset(); //恢複初始化只想的位置,該位置位於集合中第一個元素之前 } public interface IEnumerable //返回一個逐一查看集合的枚舉數 { IEumerator GetEnumerator(); }
如果我們想在自訂的資料結構中添加迭代器,改如何?呢?
我們只需要繼承並實現介面IEnumerable 即可。
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
設計模式之迭代器模式