迭代模式:
提供一種方法順序訪問一個彙總對象中各個元素,而又不需暴露該對象的內部表示。
.NET中應用:
/// <summary>
/// 抽象聚集
/// </summary>
public interface IList
{
IIterator GetIterator();
}
/// <summary>
/// 抽象迭代器
/// </summary>
public interface IIterator
{
bool MoveNext();
Object CurrentItem();
void First();
void Next();
}
/// <summary>
/// 具體聚集
/// </summary>
public class ConcreteList : IList
{
int[] list;
public ConcreteList()
{
list = new int[] { 1, 2, 3, 4, 5 };
}
public IIterator GetIterator()
{
return new ConcreteIterator(this);
}
public int Length
{
get { return list.Length; }
}
public int GetElement(int index)
{
return list[index];
}
}
/// <summary>
/// 具體迭代器
/// </summary>
public class ConcreteIterator : IIterator
{
private ConcreteList list;
private int index;
public ConcreteIterator(ConcreteList list)
{
this.list = list;
index = 0;
}
public bool MoveNext()
{
if (index < list.Length)
return true;
else
return false;
}
public Object CurrentItem()
{
return list.GetElement(index);
}
public void First()
{
index = 0;
}
public void Next()
{
if (index < list.Length)
{
index++;
}
}
}
/// <summary>
/// 用戶端程式
/// </summary>
public class Program
{
static void Main(string[] args)
{
IIterator iterator;
IList list = new ConcreteList();
iterator = list.GetIterator();
while (iterator.MoveNext())
{
int i = (int)iterator.CurrentItem();
Console.WriteLine(i.ToString());
iterator.Next();
}
Console.Read();
}
}
首先有一個抽象的聚集IList,所謂的聚集就是就是資料的集合,可以迴圈去訪問它。它只有一個方法GetIterator()讓子類去實現,用來獲得一個迭代器對象。抽象的迭代器IIterator,它是用來訪問聚集的類,封裝了一些方法,用來把聚集中的資料按順序讀取出來。通常會有MoveNext()、CurrentItem()、Fisrt()、Next()等幾個方法讓子類去實現。具體的聚集ConcreteList ,它實現了抽象聚集中的唯一的方法,同時在裡面儲存了一組資料,這裡我們加上Length屬性和GetElement()方法是為了便於訪問聚集中的資料。具體迭代器ConcreteIterator
,實現了抽象迭代器中的四個方法,在它的建構函式中需要接受一個具體聚集類型的參數,在這裡面我們可以根據實際的情況去編寫不同的迭代方式。
IEnumerable和IEnumerator明顯是在.NET Framework封裝好的迭代器模式,實現了IEnumerator的迭代類從實現了IEnumerable的集合類中分離開來,這個類負責來處理枚舉的狀態(包括怎麼表達當前數組中的元素和如何迭代集合中的元素),並把枚舉的演算法包含其中。這種方法能讓你同時有幾個用不同的方法枚舉集合的迭代器,而不需要給集合添加任何的複雜性!
public class Persons : IEnumerable
{
string[] m_Names;
public Persons(params string[] Names)
{
m_Names = new string[Names.Length];
Names.CopyTo(m_Names, 0);
}
public IEnumerator GetEnumerator()
{
foreach (string s in m_Names)
{
yield return s;
}
}
}
public class Program
{
static void Main(string[] args)
{
Persons arrPersons = new Persons("Michel", "Christine", "Mathieu", "Julien");
foreach (string s in arrPersons)
{
Console.WriteLine(s);
}
Console.ReadLine();
}
}
參考:http://www.cnblogs.com/Terrylee/archive/2006/09/16/Iterator_Pattern.html