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