迭代器模式

来源:互联网 发布:ubuntu和ubuntu mate 编辑:程序博客网 时间:2024/06/05 06:27
故事:
     一天,我去北京出游,上了公交车站,人很多很拥挤。
     ”上车的乘客买票了。”售票员一边在人缝中穿插,一边喊道。
      “大爷,您的行李包太大了,需要买两张票。”售票员对一位大爷说。
      “行李还需要买票?!它又不是个人。”大爷说,极不情愿地买了两张票。
      “还有三位乘客没有买票。”售票员喊道。
      “这售票员记性够好的啊,车上有多少人都记得,厉害!”我心想。
      此时从人群接连递过来三块钱,票买齐了。售货员一边数着大把的钞票一边做到了自己的位置上。
       故事就是这样的,售票员其实在做一件重要的事,就是把车厢里的所有人都遍历了一遍,不放过一个不买票的乘客。这就是一个设计模式的体现——迭代器模式

迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。
     
不管你上来的是人还是行李,只要是来乘车的乘客就必须要买票。同理,当你需要访问一个聚集对象,而且不管这些对象是什么都需要遍历的时候,你就应该考虑用迭代器模式。

另外,售票员从车头到车尾来售票,也可以从车尾向车头来售票,也就是说,你需要对聚集有多种方式遍历时,可以考虑用迭代器模式。

由于不管乘客是什么,售票员的做法始终是相同的,都是从第一个开始,下一个是谁,是否结束,当前售到哪个人了,这些方法每天他都在做,也就是说,为遍历不同的聚集结构提供如开始、下一个、是否结束、当前哪一项等统一的接口。

结构图如下:



具体代码如下:

Irator 迭代器抽象类
<span style="font-size:18px;">abstract class Aggregate    {        public abstract Iterator CreateIterator();    }</span>


Aggregate 聚集抽象类
<span style="font-size:18px;">  abstract class Aggregate    {        public abstract Iterator CreateIterator();    }</span>


ConcreteIterator具体迭代类,继承Iterator
<span style="font-size:18px;">class ConcreteIterator : Iterator    {        private ConcreteAggregate aggregate;             //定义了一个具体聚集对象           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];                //返回当前的聚集对象          }    }</span>


ConcreteAggregate 具体聚集类 继承Aggregate
<span style="font-size:18px;">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); }          //声明一个索引器        }    }  </span>

   
 客户端代码
<span style="font-size:18px;">static void Main(string[] args)        {            ConcreteAggregate a = new ConcreteAggregate();            a[0] = "我";            a[1] = "大爷";            a[2] = "行李";            Iterator i = new ConcreteIterator(a);            object item = i.First();            while (!i.IsDone())            {                Console.WriteLine("{0}请买车票!", i.CurrentItem());                i.Next();            }            Console.Read();        }    }</span>



总结:售票员真是一个迭代高手啊,每次有乘客上车他都数清楚人数,然后再对整车的乘客进行迭代遍历,不放过任何逃票的人。看来任何行业都有技巧和经验,需要多思考、多琢磨,才能做到最好。编程又何尝不是这样,我相信代码没有最好,只有更好,要继续努力!  
0 0
原创粉丝点击