今天研究了一下迭代器模式.写了个小例子,记录一下,便于日后温习.为什么要用迭代器模式呢?其实很简单,我们在项目当中会用到很多不同类型的数据,把这些数据放到一起可以方便我们管理,而操作时不需要知道他具体的内部是如何的,只要能准确的找到我们所要的数据就可以了。 这个时候,迭代器模式就帮了我们的大忙。
首先,要创建一个实体的集合.里面存储了一个ArrayList,Count属性,GetEnumerator()方法(这个方法可有可无,关键看你是否需要foreach循环.好多人面试总喜欢问"能用foreach遍历访问的对象需要实现IEnumerable接口或声明GetEnumerator()方法的类型"这种题,上次面试一个大公司时我写错了一个字母,那个人埋汰了我2分钟,嘴里还念叨"这题怎么就没有一个能答对的?"所以,同志们千万要记住啊,拿出来也稍微复习一下下吧).
1
class ConcreteAggregate2

{3
public ArrayList items = new ArrayList();4
public int Count5

{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的深入探索就先不写了.
下面是迭代器的实现
1
abstract class Iterator2

{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 : Iterator10

{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
else37
return null;38
}39

40
public override object Previous()41

{42
if (current > -1)43

{44
current -= 1;45
return ca[current];46
}47
else48
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{}是将能转成整型的字符串进行转换.在输出的时候也能够看到他们不同的类型.
1
static void Main(string[] Args)2

{3
ConcreteAggregate ca = new ConcreteAggregate();4
ConcreteIterator ci = new ConcreteIterator(ca);5

Test1#region Test16

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
#endregion16

17

Test2#region Test218

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
try38

{39
ca[ca.Count] = int.Parse(cmd);//转换成整型40
}41
catch42

{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
#endregion55
}