1、集合內部結構與外部訪問
1)集合的功能是用來保存其它對象的。
2)減小依賴,適應更多的變化。
2、動機(Motivation)
1)在軟件構建過程當中,集合對象內部結構經常變化各異。但對於這些集合對象,咱們但願在不暴露其內部結構的同時,能夠讓外部客戶代碼透明地訪問其中包含的元素;同時這種「透明遍歷」也爲「同一種算法在多種集合對象上進行操做」提供了可能。
2)使用面向對象技術將這種遍歷機制抽象爲「迭代器對象」爲「應對變化中的集合對象」提供了一種優邪雅的方式。
3、意圖(Intent)
提供一種方法順序訪問一個聚合對象中的各個元素,而又不暴露該對象的內部表示。
——《設計模式》GoF
4、實例:
1)迭代器的兩個抽象接口:
public interface IEnumerable
{
IEnumerator GetEnumerator();
}
public interface IEnumerator
{
Object Current{ get;} //返回當前集合中的元素
bool MoveNext(); //遍歷集合
void Reset(); //方法恢復初始化指向的位置
}算法
2)實現IEnumerable接口和IEnumerator接口
public class MyCollection : IEnumerable
{
int[] items;
public MyCollection(int[] iNums)
{
items = new int[iNums.Length];
iNums.CopyTo(items, 0);
}
public IEnumerator GetEnumerator()
{
//1.1作法
return new MyEnumerator(this);
/*
//2.0作法,不須要寫下面的私有類
for (int i = 0; i < items.Length; i++)
{
//yieid return語句是一個能動態生成迭代類型的語句
yieid return items[i];
}
*/
}
private class MyEnumerator : IEnumerator
{
int nIndex;
MyCollection collection;
public MyEnumerator(MyCollection collection)
{
this.collection = collection;
nIndex = -1;
}
public bool MoveNext()
{
nIndex++;
return (nIndex < collection.items.Length);
}
public object Current
{
get
{
return (collection.items[nIndex]);
}
}
public void Reset()
{
nIndex = -1;
}
}
}設計模式
public static class Main()
{
int[] iNums = new int[5]{12, 44, 33, 2, 50};
MyCollection col = new MyCollection(iNums);
foreach (int i in col)
{
Console.WriteLine(i);
}
//徹底抽象(不依賴)於容器(集合)結構的訪問操做
IEnumerator ietor = col.GetEnumerator();
while(ietor.MoveNext())
{
int i = (int)ietor.Current;
Console.WriteLine(i);
}
//下面的while循環部份在.NET中被抽象爲上面的foreach部分了
}this
5、Iterator模式的幾個要點
1)迭代抽象:訪問一個聚合對象的內容而無需暴露它的內部表示。
2)迭代多態:爲遍歷不一樣的集合結構提供一個統一的接口,從而支持一樣的算法在不一樣的集合結構上進行操做。
3)迭代器的健壯性考慮:遍歷的同時更改迭代器所在的集合結構,會致使問題。設計