迭代器提供了一種方法順序訪問一個彙總對象,而不暴露對象的內部細節 。net中的foreach就是典型的迭代器模式
圖示:
代碼:<喎?http://www.bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+ICCztcnPytvGsdSxttSzy7/NytvGsTwvcD4KPHA+PHByZSBjbGFzcz0="brush:java;"> class Program { static void Main(string[] args) { ConcreteAggregate a = new ConcreteAggregate(); a[0] = "大鳥"; a[1] = "xiao菜"; a[2] = "行李"; a[3] = "老外"; a[4] = "內部員工"; a[5] = "小偷"; 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(); } //彙總抽象類別 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() { //throw new NotImplementedException(); return aggregate[0]; } public override object Next() { //throw new NotImplementedException(); object ret = null; current++; if (current < aggregate.Count) { ret = aggregate[current]; } return ret; } public override bool IsDone() { //throw new NotImplementedException(); return current >= aggregate.Count ? true : false; } public override object CurrentItem() { //throw new NotImplementedException(); return aggregate[current]; } } class ConcreteAggregate : Aggregate { //聲明一個IList 泛型變數 用來存放彙總對象 private IList<object> items=new List<object>(); public override Iterator createIterator() { //throw new NotImplementedException(); 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); } } }
運行結果: