迭代器模式

[ Iterator ]

提供一种方法顺序访问一个聚合对象中各个元素 , 而又不暴露该对象的内部表示 。



源码 :

迭代器抽象类
abstract class Iteraor
{
  public abstract object First();
  public abstract object Next();
  public abstract bool IsDone();
  public abstract object CurrentItem();
}




聚集抽象类
abstract class Aggregate
{
  public abstract Iterator CreateIterator();
}




//具体迭代器类 , 继承 Iterator
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 ret = null;
    current ++ ;
    if(current < aggregate.Count)
    {
      ret = aggregate[current];
    }
    return ret;
  }

  public override bool IsDone()
  {
    return current >= aggregate.Count ? true : false;
  }

  public override object CurrentItem()
  {
    return aggregate[current];
  }

}



//具体聚集类 , 继承 Aggregate
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.Inser(index,value); }
  }
}



//客户端代码
static void Main(string[] args)
{
  ConcreteAggregate a = new ConcreteAggregate();

  a[0] = "大鸟";
  a[1] = "小菜";
  a[2] = "行李";
  a[3] = "老外";
  a[4] = "公交内部员工";
  a[5] = "小偷";

  Iterator i = new ConcreteIterator(a);

  object item = i.First();

  while(!i.IsDone())
  {
    Console.WriteLine("{0} 请买车票",i.CurrentItem());
    i.Next();
  }

  Console.Read();
}


.NET 实现迭代器模式 : foreach in 语句

posted on 2012-02-21 13:08  多个马甲  阅读(167)  评论(0编辑  收藏  举报