常用軟體設計模式(六)迭代器模式
阿新 • • 發佈:2018-11-08
迭代器模式不常用,很多高階語言都將該模式封裝在語言中了,入C#的 foreach in 但是有必要了解一下
迭代器模式:提供一個方法順序訪問一個聚合物件中各個元素,而又不暴露該物件的內部表示。
優點: 1、它支援以不同的方式遍歷一個聚合物件。
2、迭代器簡化了聚合類。
3、在同一個聚合上可以有多個遍歷。
4、在迭代器模式中,增加新的聚合類和迭代器類都很方便,無須修改原有程式碼。
缺點:由於迭代器模式將儲存資料和遍歷資料的職責分離,增加新的聚合類需要對應增加新的迭代器類,類的個數成對增加,這在一定程度上增加了系統的複雜性。
//Iterator迭代器抽象類 abstract class Iterator { public abstract object First(); public abstract object Next(); public abstract bool IsDone(); public abstract object CurrentItem(); } //ConcreteIterator具體迭代器類,繼承Iterator Class ConcreteIterator:Iterator { private ConcreteAggregate aggregate; private int current = 0; public ConcreteIterator(ConcreteAggregate aggregate) { this.aggregate = aggregate; } public ovarride object First() { return aggregate[0]; } public override object Next() { object ret = null; current ++; if() { ret = aggregate[current]; } return ret; } public override bool IsDone() { return current >= aggregate.Count ? true : false; } public override object CurrentItem() { return aggregate[current]; } } class ConcreteAggregate:Aggregate { private IList<object> item = new List<object>(); public override Iterator CreateIterator() { return new ConcreteIterator(this); } public int Count { get{return item.Count;} } public object this[int index] { get{return item[index];} set{item.Insert(index,value);} } } //客戶端程式碼 static void Main(string[] args) { ConcreteAggregate a = new ConcreteAggregate(); a[0] = "A1"; a[1] = "A2"; a[2] = "A3"; a[3] = "A4"; Iterator i = new ConcreteIterator(a); object item = i.First(); while(!i.IsDone()) { Console.WriteLine("{0}",i.CurrentItem()); i.Next(); } Console.Read(); }