今天研究了一下迭代器模式.写了个小例子,记录一下,便于日后温习.为什么要用迭代器模式呢?其实很简单,我们在项目当中会用到很多不同类型的数据,把这些数据放到一起可以方便我们管理,而操作时不需要知道他具体的内部是如何的,只要能准确的找到我们所要的数据就可以了。 这个时候,迭代器模式就帮了我们的大忙。
首先,要创建一个实体的集合.里面存储了一个ArrayList,Count属性,GetEnumerator()方法(这个方法可有可无,关键看你是否需要foreach循环.好多人面试总喜欢问"能用foreach遍历访问的对象需要实现IEnumerable接口或声明GetEnumerator()方法的类型"这种题,上次面试一个大公司时我写错了一个字母,那个人埋汰了我2分钟,嘴里还念叨"这题怎么就没有一个能答对的?"所以,同志们千万要记住啊,拿出来也稍微复习一下下吧).
Code
1class ConcreteAggregate
2 {
3 public ArrayList items = new ArrayList();
4 public int Count
5 {
6 get { return items.Count; }
7 }
8 public object this[int index]
9 {
10 get { return items[index]; }
11 set { items.Insert(index, value); }
12 }
13
14 public IEnumerator GetEnumerator()
15 {
16 for (int i = 0; i < Count; i++)
17 {
18 yield return items[i];
19 }
20 }
21 }
注意GetEnumerator()里yield的用法,如果去掉yield,一定会暴出类型不匹配的错误.至于yield的深入探索就先不写了.
下面是迭代器的实现
Code
1abstract class Iterator
2 {
3 public abstract object First();
4 public abstract object Last();
5 public abstract object Next();
6 public abstract object Previous();
7 }
8
9 class ConcreteIterator : Iterator
10 {
11 ConcreteAggregate ca = new ConcreteAggregate();
12 int current = 0;
13
14 public ConcreteIterator(ConcreteAggregate ca)
15 {
16 this.ca = ca;
17 }
18
19 public override object First()
20 {
21 return ca[0];
22 }
23
24 public override object Last()
25 {
26 return ca[ca.Count - 1];
27 }
28
29 public override object Next()
30 {
31 if (current < ca.Count - 1)
32 {
33 current += 1;
34 return ca[current];
35 }
36 else
37 return null;
38 }
39
40 public override object Previous()
41 {
42 if (current > -1)
43 {
44 current -= 1;
45 return ca[current];
46 }
47 else
48 return null;
49 }
50
51 public IEnumerator GetEnumerator()
52 {
53 for (int i = 0; i < ca.Count; i++)
54 {
55 yield return ca[i];
56 }
57 }
58 }
根据实际需要修改吧,基本的先写这些.
最后是程序的入口,里面写的try{}catch{}是将能转成整型的字符串进行转换.在输出的时候也能够看到他们不同的类型.
Code
1static void Main(string[] Args)
2 {
3 ConcreteAggregate ca = new ConcreteAggregate();
4 ConcreteIterator ci = new ConcreteIterator(ca);
5 Test1#region Test1
6
7 //ca[0] = "Item A";
8 //ca[1] = "Item B";
9 //ca[2] = "Item C";
10 //ca[3] = "Item D";
11 //foreach (object a in ca)
12 // Console.WriteLine(a);
13 //Console.ReadLine();
14
15 #endregion
16
17 Test2#region Test2
18
19 while (true)
20 {
21 Console.WriteLine("");
22 Console.Write("Command: ");
23 string cmd = Console.ReadLine();
24 if (cmd.Trim() != "")
25 {
26 Console.WriteLine("*******开始*******");
27 object obj;
28 switch (cmd.Trim().ToLower())
29 {
30 case "close": return;
31 case "count": Console.WriteLine("Count: " + ca.Count); break;
32 case "first": obj = ci.First(); Console.WriteLine("First: " + obj + " Type: " + obj.GetType()); break;
33 case "last": obj = ci.Last(); Console.WriteLine("Last: " + obj + " Type: " + obj.GetType()); break;
34 case "next": obj = ci.Next(); Console.WriteLine("Next: " + obj + " Type: " + obj.GetType()); break;
35 case "previous": obj = ci.Previous(); Console.WriteLine("Previous: " + obj + " Type: " + obj.GetType()); break;
36 default:
37 try
38 {
39 ca[ca.Count] = int.Parse(cmd);//转换成整型
40 }
41 catch
42 {
43 ca[ca.Count] = cmd;//字符串型
44 }
45 foreach (object a in ci)//循环GetEnumerator()的用处
46 Console.WriteLine(a);
47 ci = new ConcreteIterator(ca);//添加新项后重新实例化,可以用别的方法实现.
48 break;
49 }
50 Console.WriteLine("=======结束=======");
51 }
52 }
53
54 #endregion
55 }