意图
提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示。
使用场合
1.访问一个聚合对象的内容而无需暴露他的内部表示。
2.支持对聚合对象的多种遍历。
3.为遍历不同的聚合对象提供一个统一的接口。
结构
Iteator(迭代器):定义访问和遍历元素的接口。
ConcreteIteator(具体迭代器):实现迭代器,该聚合遍历时跟踪当前位置。
Aggregate(聚合):创建相应迭代对象的接口,这是一个工厂方法。
ConcreteAggregate(具体聚合):实现创建相应迭代器的接口,该操作返回ConcreteIteator的一个适当实例,这是抽象工厂方法的实现。
效果
采用迭代器模式可以实现对聚合的多种遍历方式,如对于树型结构的聚合,可以采用深度优先遍历和广度优先遍历。只要采用不同的迭代器实例代替原先的实例即可。
迭代器简化了聚合的接口,聚合不用包含于迭代相关的操作。迭代器对象保持迭代的状态,因此可以同时有多个迭代器存在。
.NET中的强类型集合与迭代器模式
下面是2.0的代码,与1.1的实现区别不大。只是在用“IEnumerable<>”和“IEnumerator<>”代替了“IEnumerable”和“IEnumerator”。
“IEnumerable<>”和“IEnumerator<>”指定了具体类型,在实现和使用强类型集合时更方便。
.Net引入两个接口实现迭代器模式,聚合类需要实现IEnumerable接口,相应的迭代器类需要实现IEnumerator接口。
集合中的子类:
using System.Collections.Generic;
using System.Text;
namespace IteratorPattern.ex27_3
{
public class MyClass
{
public string FirstName;
public string LastName;
}
}
集合类:
using System.Collections.Generic;
using System.Text;
using System.Collections;
namespace IteratorPattern.ex27_3
{
class MyClassCollection:CollectionBase,IEnumerable<MyClass>
{
public MyClass this[int index]
{
get { return (MyClass)List[index]; }
}
public int Add(MyClass m)
{
return List.Add(m);
}
IEnumerable
private class MyEnumerator : IEnumerator<MyClass>
{
private int index = -1;
private MyClassCollection mcs;
public MyEnumerator(MyClassCollection ms)
{
this.mcs = ms;
}
IEnumerator
IDisposable メンバ
IEnumerator 成员
}
}
}
测试代码:
{
IteratorPattern.ex27_3.MyClassCollection mcs = new IteratorPattern.ex27_3.MyClassCollection();
Console.WriteLine("Add Item");
for (int i = 0; i < 3; i++)
{
IteratorPattern.ex27_3.MyClass mc = new IteratorPattern.ex27_3.MyClass();
mc.FirstName = "FirstName" + i.ToString();
mc.LastName = "LastName" + i.ToString();
Console.WriteLine("{0} {1}", mc.FirstName, mc.LastName);
mcs.Add(mc);
}
Console.WriteLine("foreach collection");
foreach (IteratorPattern.ex27_3.MyClass mc in mcs)
{
Console.WriteLine("{0} {1}",mc.FirstName,mc.LastName);
}
IEnumerator<IteratorPattern.ex27_3.MyClass> ien = mcs.GetEnumerator();
Console.WriteLine("use IEnumerator<>");
while (ien.MoveNext())
{
IteratorPattern.ex27_3.MyClass mc = ien.Current;
Console.WriteLine("{0} {1}", mc.FirstName, mc.LastName);
}
}
遍历Web缓存
Web缓存Cache实现了IEnumerable接口,它可以创建一个类型为IDictionaryEnumerator的迭代器实现对缓存内容的遍历。
while(CacheEnum.MoveNext())
{
object item = CacheEnum.Current;
}
相关模式
1.组合模式:迭代器经常用于对复合对象的访问。
2.工厂方法:被迭代器访问的对象采用工厂方法实例化迭代器。