I:提供一种方法顺序访问一个聚合对象中各个元素,而不暴露该对象的内部表示。
当你需要访问一个聚集对象,而且不管这些对象是什么都需要遍历的时候,你就应该考虑用迭代器模式。你需要对聚集有多种方式遍历时,可以考虑用迭代器模式。为遍历不同的聚集结构提供如开始、下一个、是否结束、当前哪一项等统一的接口。
abstract class Iterator
{
public abstract object First();
public abstract object Next();
public abstract bool IsDone();
public abstract object CurrentItem();
}
abstract class Aggregate
{
public abstract Iterator CreateIterator();
}
class ConcreteIterator:Iterator
{
private ConcreteAggregate aggregate;
private int current = 0;
public ConcreteIterator(ConcreteAggregate aggregate)
{
this.aggregate = aggregate;
}
public override object First()
{
return aggregate[0];
}
public override object Next()
{
object obj = null;
current++;
if (current < aggregate.Count)
{
obj = aggregate[current];
}
return obj;
}
public override bool IsDone()
{
return current >= aggregate.Count ? true : false;
}
public override object CurrentItem()
{
return aggregate[current];
}
}
class ConcreteAggregate:Aggregate
{
private IList<object> items = new List<object>();
public override Iterator CreateIterator()
{
return new ConcreteIterator(this);
}
public int Count
{
get { return items.Count; }
}
public object this[int index]
{
get { return items[index]; }
set { items.Insert(index, value); }
}
}
ConcreteAggregate aggregate = new ConcreteAggregate();
aggregate[0] = "大鸟";
aggregate[1] = "小菜";
aggregate[2] = "行李";
aggregate[3] = "老外";
aggregate[4] = "公交内部员工";
aggregate[5] = "小偷";
//Iterator i = new ConcreteIterator(aggregate);
Iterator i = new ConcreteIteratorDesc(aggregate);
object item = i.First();
while (!i.IsDone())
{
Console.WriteLine(string.Format("{0} 请买票", i.CurrentItem()));
i.Next();
}
以上代码是从前到后的迭代,如果我们需要从后往前迭代,则可添加如下类:
class ConcreteIteratorDesc:Iterator
{
private ConcreteAggregate aggregate;
private int current = 0;
public ConcreteIteratorDesc(ConcreteAggregate aggregate)
{
this.aggregate = aggregate;
current = aggregate.Count - 1;
}
public override object First()
{
return aggregate[aggregate.Count - 1];
}
public override object Next()
{
object obj = null;
current--;
if (current >= 0)
{
obj = aggregate[current];
}
return obj;
}
public override object CurrentItem()
{
return aggregate[current];
}
public override bool IsDone()
{
return current < 0 ? true : false;
}
}
.NET迭代器实现:
IList<string> iterator = new List<string>();
iterator.Add("大鸟");
iterator.Add("小菜");
iterator.Add("行李");
iterator.Add("老外");
iterator.Add("公交内部员工");
iterator.Add("小偷");
foreach (string item in iterator)
{
Console.WriteLine(string.Format("{0} 请买票", item));
}
迭代器模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可让外部代码透明地访问集合内部的数据。