.Net行为型设计模式之迭代器模式(Iterator)
概述
迭代器模式是一种常见的行为型设计模式,它的主要作用是提供一种方法,对聚合对象中的元素进行遍历。当我们需要访问一个聚合对象中的元素时,我们可以使用迭代器模式,不必暴露该聚合对象的内部结构,从而保证了该对象的安全性。
迭代器模式分为内部迭代器和外部迭代器。内部迭代器由聚合对象自己实现,它的优点在于简单方便。而外部迭代器由客户端实现,看起来比较麻烦,但是更加灵活。
示例
在下面的示例中,我们演示了如何使用内部迭代器,来对一个简单的聚合对象进行遍历。
public class MyList<T>
{
private List<T> list = new List<T>();
public void Add(T item)
{
list.Add(item);
}
public IEnumerator<T> GetEnumerator()
{
foreach (T item in list)
{
yield return item;
}
}
}
public class Client
{
public void Iterate()
{
MyList<int> list = new MyList<int>();
list.Add(1);
list.Add(2);
foreach (int item in list)
{
Console.WriteLine(item);
}
}
}
在上面的代码中,MyList
类包含在 List
类型的内部聚合对象。为了支持遍历,我们实现了一个内部迭代器 GetEnumerator
方法。该方法使用 yield return
语句,将列表中的所有元素依次返回给客户端。客户端可以使用 foreach
语句,逐一遍历列表中的元素。
下面是一个使用外部迭代器的示例,它与上面的示例类似,只是使用了 IEnumerator
接口来实现迭代器。
public class MyList<T>
{
private List<T> list = new List<T>();
public void Add(T item)
{
list.Add(item);
}
public IEnumerator<T> GetEnumerator()
{
return new MyListIterator<T>(this);
}
private class MyListIterator<T> : IEnumerator<T>
{
private MyList<T> list;
private int currentIndex = -1;
public MyListIterator(MyList<T> list)
{
this.list = list;
}
public T Current => list[currentIndex];
object IEnumerator.Current => Current;
public void Dispose()
{
}
public bool MoveNext()
{
currentIndex++;
return currentIndex < list.Count;
}
public void Reset()
{
currentIndex = -1;
}
}
}
public class Client
{
public void Iterate()
{
MyList<int> list = new MyList<int>();
list.Add(1);
list.Add(2);
IEnumerator<int> iter = list.GetEnumerator();
while (iter.MoveNext())
{
Console.WriteLine(iter.Current);
}
}
}
在这个示例中,我们还创建了一个私有内部类 MyListIterator
,它实现了 IEnumerator
接口,并包含了对 MyList
对象的引用。在迭代时,我们可以使用 MoveNext
方法和 Current
属性,来访问列表中的元素。
总结
迭代器模式是一种非常实用的设计模式,可以帮助我们对聚合对象进行遍历,并保证聚合对象的安全性。在实际开发中,我们可以根据具体的需求,选择使用内部迭代器或外部迭代器。无论使用哪种迭代器,我们都应该尽量避免直接访问聚合对象,而是尽可能地使用迭代器来遍历它们。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:.Net行为型设计模式之迭代器模式(Iterator) - Python技术站