提供一种方法顺序访问一个聚合对象中的各个元素,而不暴露该对象的内部表示。
主要组成:
Aggregate-聚合父类或接口
ConcreteAggregate-具体聚合对象
Iterator-迭代器父类或接口
ConcreteIterator-具体迭代器
相关类:
using System;
using System.Collections.Generic;
namespace Iterator
{
/// <summary>
/// 聚合父类或接口
/// </summary>
abstract class AggregateClass
{
public abstract Iterator CreateIterator();
}
/// <summary>
/// 列表聚合
/// </summary>
class ListAggregate : AggregateClass
{
List<object> list = new List<object>();
public override Iterator CreateIterator()
{
return new ListIterator(this);
}
public int Count
{
get { return list.Count; }
}
public void Add(object item)
{
list.Add(item);
}
public object GetItemAt(int index)
{
return list[index];
}
}
/// <summary>
/// 迭代器父类或接口
/// </summary>
abstract class Iterator
{
public abstract void First();
public abstract void Next();
public abstract bool IsDone();
public abstract object CurrentItem();
}
/// <summary>
/// 列表迭代器
/// </summary>
class ListIterator : Iterator
{
ListAggregate listAggregate;
int cuurentIndex;
public ListIterator(ListAggregate listAggregate)
{
this.listAggregate = listAggregate;
}
//将迭代器置于第一个元素
public override void First()
{
cuurentIndex = 0;
}
//下一个元素
public override void Next()
{
cuurentIndex++;
}
//是否超出列表
public override bool IsDone()
{
return cuurentIndex >= listAggregate.Count;
}
//返回当前元素
public override object CurrentItem()
{
if (IsDone())
{
throw new IndexOutOfRangeException();
}
return listAggregate.GetItemAt(cuurentIndex);
}
}
}
调用:
using System;
namespace Iterator
{
class Program
{
static void Main(string[] args)
{
//列表聚合
ListAggregate listAggregate = new ListAggregate();
listAggregate.Add("迭");
listAggregate.Add("代");
listAggregate.Add("器");
//创建迭代器
Iterator listIterator = listAggregate.CreateIterator();
for (listIterator.First(); !listIterator.IsDone(); listIterator.Next())
{
Console.WriteLine(listIterator.CurrentItem());
}
Console.Read();
}
}
}
结果:
参考资料:《设计模式-可复用面对对象软件的基础》