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