迭代器模式(Iterator)

来源:互联网 发布:2010年韩国进出口数据 编辑:程序博客网 时间:2024/04/30 09:01

1, 从 For循环说起


         在几乎所有的编程语言中,都有3大结构:顺序,选择,循环。它们就像是3种框架,用来搭建不同的模型。在这3种结构中,最为独特的,要当属循环结构了。其实,我觉得叫它“懒人结构”更好。

    我们自己是比较擅长处理顺序和选择的,但是如果这些东西交给计算机处理,那么我们就要为编写很多代码,告诉它出现的各种情况,应该怎样处理各种情况,这对于计算机来说,其实是件比较困难的事。但对于循环结构,计算机是比较乐意处理它的。这是间非常有意思的事,我们厌倦重复,而计算机喜欢这种重复,它处理起来无压力。so ,这时候,我们可以和计算机合作,我们处理那些非常有创造性的东西,让计算机处理那些繁琐的重复工作。“懒人结构”创造了新的合作模式。

    下面来看个非常经典的for循环求和:

static void Main(string[] args)        {            int i;            int [] a=new int[100];            int sum;            for (i = 1; i <= 100; i++)            {                a[i] = i;                sum += a[i];            }            Console.WriteLine(sum);        }

    for循环起到了个框架的作用,每循环一次,它里面就变化一次,计算机对此乐此不疲,然后lazybones们就可以休息了。


   for循环虽然非常好,但是一旦我要处理的东西不再是数字,而是其他别的东西,比如,我要重复给一个流水线上的啤酒瓶贴编号标签,这时候怎么办?

    no problem,foreach循环可以帮你。foreach感觉是for循环的改进版,以前用for循环,只能利用整数进行循环遍历,而且还得自己控制上下界,一旦上下界控制不好,很可能出现越界的问题。但是foreach循环却不必担心,只要你给堆东西,我就能一个个处理掉,至于有多少,我是不管的。


  2,foreach


     例如,用foreach循环给瓶子贴标签的过程:

   

namespace foreach循环示例{    class GlassLabel    {        private int Number;        public GlassLabel(int i)        {            Number = i;        }                public void PrintLabel()        {            Console.WriteLine("瓶子" + Number + "已经贴好了标签。");        }    }    class Program    {        static void Main(string[] args)        {            IList<GlassLabel> GlassBasket = new List<GlassLabel>();            //在瓶子篮子里面,加入100个瓶子            for (int i = 0; i < 100; i++)            {                GlassBasket.Add(new GlassLabel(i));            }                        //对100个瓶子贴标签            foreach (GlassLabel glass in GlassBasket)            {                glass.PrintLabel();            }                    }    }}

看一下震撼的结果(部分图,可以自己运行程序看看):


        

      要是你自己给100个瓶子贴标签,估计一会儿就又烦又累了,所以,lazybones们,还是把这些没有创意的工作交给计算机吧。

     这样处理重复工作的好方法,我们要总结下哦。这也是我们为什么要学习设计模式的原因:去除重复性的工作,不要解决任何问题都从头开始。


 3,迭代器模式


  也许是因为有了编译器为我们做好的foreach,所以我们每次都是保持“拿来主义”,但是学习下迭代器模式还是很要必要滴。

  


  上面这个图可以分成左右两部分看,左边是我们要处理的对象,通常我们处理的是这个对象的一个集合。右边是对这个对象的遍历行为,也就是我们自己写一个foreach用来处理对象。


  本模式的好处:迭代器模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可以让外部代码透明地访问集合内部的数据。

 

   




 

1 0