迭代器模式是GOF23種模式中的一種,目的是為了提供對集合的遍歷。為什麼要實現迭代器模式:
假設存在一個數組,我們的遍歷模式可能是采用依據索引來進行遍歷。又假設存在一個HashTable,我們的遍歷模式就可能按照鍵值來進行遍歷。無論是哪個集合,如果它們的遍歷沒有一個公共的接口,那麼我們的客戶端進行調用的時候,相當於是對具體類型進行了編碼。這樣以來,當需求變化的時候,就必須修改我們的代碼。並且,由於客戶端代碼過多的關注了集合的內部實現,代碼的可移植性就會變得很差,這直接違反了面向對象中的開閉原則。於是,迭代器模式就誕生了。現在,不要管FCL中是如何實現該模式的,我們先來實現一個我們自己的迭代器模式。
代碼清單:
public class Program
{
static void Main(string[] args)
{
//使用接口IMyEnumerable代替MyList
IMyEnumerable list = new MyList();
//得到迭代器,在循環中針對迭代器編碼,而不是集合MyList
IMyEnumerator enumerator = list.GetEnumerator();
for (int i = 0; i < list.Count; i++)
{
object current = enumerator.Current;
enumerator.MoveNext();
}
while (enumerator.MoveNext())
{
object current = enumerator.Current;
}
}
}
/// <summary>
/// 要求所有的迭代器全部實現該接口
/// </summary>
interface IMyEnumerator
{
bool MoveNext();
object Current { get; }
}
/// <summary>
/// 要求所有的集合實現該接口
/// 這樣一來,客戶端可以針對該接口編碼,而無需關注具體的實現
/// </summary>
interface IMyEnumerable
{
IMyEnumerator GetEnumerator();
int Count { get; }
}
class MyList : IMyEnumerable
{
object[] items = new object[10];
public IMyEnumerator MyEnumerator { get; set; }
public object this[int i]
{
get { return items[i]; }
set { this.items[i] = value; }
}
public int Count
{
get { return items.Length; }
}
public IMyEnumerator GetEnumerator()
{
if (MyEnumerator == null)
{
return new MyEnumerator(this);
}
return MyEnumerator;
}
}
class MyEnumerator : IMyEnumerator
{
int index = 0;
MyList myList;