码迷,mamicode.com
首页 > Web开发 > 详细

ASP.NET编程总结

时间:2015-08-28 02:12:37      阅读:269      评论:0      收藏:0      [点我收藏+]

标签:迭代器模式

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

迭代器模式(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>



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

版权声明:本文为博主原创文章,未经博主允许不得转载。

ASP.NET编程总结

标签:迭代器模式

原文地址:http://blog.csdn.net/qwlzxx/article/details/46610145

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!