迭代器模式(Iterator Pattern)是一种非常常用的设计模式。这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。
一共四个角色
迭代器角色(Iterator):迭代器角色负责定义访问和遍历元素的接口
具体迭代器角色(MyIteraror):具体迭代器角色实现了迭代器接口,并需要记录遍历中的当前位置。
聚合角色(Container):聚合角色负责定义获得迭代器角色的接口
具体聚合角色(MyContainer):具体聚合角色实现聚合角色接口。
class Program
{
static void Main(string[] args)
{
Iterator iterator;
Container container = new MyContainer();
iterator = container.GetIterator();
while (iterator.HasNext())
{
int i = (int)iterator.GetCurrent();
Console.WriteLine(i.ToString());
iterator.Next();
}
Console.Read();
}
}
interface Iterator
{
bool HasNext();
void Next();
Object GetCurrent();
}
interface Container
{
Iterator GetIterator();
}
class MyContainer : Container
{
int[] collection;
public MyContainer()
{
collection = new int[] { 2, 4, 6, 8 };
}
public Iterator GetIterator()
{
return new MyIterator(this);
}
public int Length
{
get
{
return collection.Length;
}
}
public int GetElement(int index)
{
return collection[index];
}
}
class MyIterator : Iterator
{
// 迭代器要集合对象进行遍历操作,自然就需要引用集合对象
private MyContainer _list;
private int _index;
public MyIterator(MyContainer list)
{
_list = list;
_index = 0;
}
public bool HasNext()
{
if (_index < _list.Length)
{
return true;
}
return false;
}
public void Next()
{
if (_index < _list.Length)
{
_index++;
}
}
public object GetCurrent()
{
return _list.GetElement(_index);
}
}
类图
优点与缺点
迭代器模式的优点:
- 迭代器模式使得访问一个聚合对象的内容而无需暴露它的内部表示,即迭代抽象。
- 迭代器模式为遍历不同的集合结构提供了一个统一的接口,从而支持同样的算法在不同的集合结构上进行操作
迭代器模式的缺点:
- 迭代器模式在遍历的同时更改迭代器所在的集合结构会导致出现异常。所以使用foreach语句只能在对集合进行遍历,不能在遍历的同时更改集合中的元素。
本文主要借鉴了《Gof设计模式》,对于在.Net中关于迭代器的更多的内容可以看我之前的文章迭代器的实现