迭代器模式不常用,很多高级语言都将该模式封装在语言中了,入C#的 foreach in 但是有必要了解一下
迭代器模式:提供一个方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。
优点: 1、它支持以不同的方式遍历一个聚合对象。
2、迭代器简化了聚合类。
3、在同一个聚合上可以有多个遍历。
4、在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码。
缺点:由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性。
//Iterator迭代器抽象类
abstract class Iterator
{
public abstract object First();
public abstract object Next();
public abstract bool IsDone();
public abstract object CurrentItem();
}
//ConcreteIterator具体迭代器类,继承Iterator
Class ConcreteIterator:Iterator
{
private ConcreteAggregate aggregate;
private int current = 0;
public ConcreteIterator(ConcreteAggregate aggregate)
{
this.aggregate = aggregate;
}
public ovarride object First()
{
return aggregate[0];
}
public override object Next()
{
object ret = null;
current ++;
if()
{
ret = aggregate[current];
}
return ret;
}
public override bool IsDone()
{
return current >= aggregate.Count ? true : false;
}
public override object CurrentItem()
{
return aggregate[current];
}
}
class ConcreteAggregate:Aggregate
{
private IList<object> item = new List<object>();
public override Iterator CreateIterator()
{
return new ConcreteIterator(this);
}
public int Count
{
get{return item.Count;}
}
public object this[int index]
{
get{return item[index];}
set{item.Insert(index,value);}
}
}
//客户端代码
static void Main(string[] args)
{
ConcreteAggregate a = new ConcreteAggregate();
a[0] = "A1";
a[1] = "A2";
a[2] = "A3";
a[3] = "A4";
Iterator i = new ConcreteIterator(a);
object item = i.First();
while(!i.IsDone())
{
Console.WriteLine("{0}",i.CurrentItem());
i.Next();
}
Console.Read();
}