C#学习笔记-迭代器模式

什么是迭代器模式?

   迭代器模式(Iterator):提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。

何时使用迭代器模式?

  当需要访问一个聚合对象,而且不管这些对象是什么都需要遍历的时候,需要考虑使用迭代器模式。

迭代器模式的组成

  Iterator():迭代器抽象类,用于定义得到开始对象,对到下一个对象,判断是否到结尾,当前对象等抽象方法,统一接口。

  ConcreteAggregate():保存聚合对象。

  ConcreteIterator():继承于Iterator,实现具体如何对聚合对象的操作。

迭代器模式具体实现

迭代器模式的结构

  

迭代器模式的实现:

Iterator:

1 abstract class Iterator
2 {
3     public abstract object First();
4     public abstract object Next();
5     public abstract bool IsDone();
6     public abstract object CurrentItem();
7 } 

ConcreteIterator:

 1 //顺序遍历
 2 class ConcreteIterator : Iterator
 3 {
 4     private ConcreteAggregate aggregate;
 5     private int current = 0;
 6     //将现在的数据组传输进来
 7     public ConcreteIterator(ConcreteAggregate aggregate)
 8     {
 9         this.aggregate = aggregate;
10     }
11     public override object CurrentItem()
12     {
13         return aggregate[current];
14     }
15 
16     public override object First()
17     {
18         return aggregate[0];
19     }
20 
21     public override bool IsDone()
22     {
23         return current >= aggregate.Count ? true : false;
24     }
25 
26     public override object Next()
27     {
28         object obj = null;
29         current++;
30         if (current < aggregate.Count)
31         {
32             obj = aggregate[current];
33         }
34         return obj;
35     }
36 }
37 //逆序遍历
38 class ConcreteIteratorDesc : Iterator
39 {
40     private ConcreteAggregate aggregate;
41     private int current = 0;
42     //传输数据进来
43     public ConcreteIteratorDesc(ConcreteAggregate aggregate)
44     {
45         this.aggregate = aggregate;
46         current = aggregate.Count - 1;
47     }
48     public override object CurrentItem()
49     {
50         return aggregate[current];
51     }
52 
53     public override object First()
54     {
55         return aggregate[aggregate.Count - 1];
56     }
57 
58     public override bool IsDone()
59     {
60         return current < 0 ? true:false;
61     }
62 
63     public override object Next()
64     {
65         object obj = null;
66         current--;
67         if (current >= 0)
68         {
69             obj = aggregate[current];
70         }
71         return obj;
72     }
73 } 

ConcreteAggregate:

 1 /// <summary>
 2 /// 创建迭代器
 3 /// 在这里看并没有什么具体的用处
 4 /// </summary>
 5 abstract class Aggregate
 6 {
 7     public abstract Iterator CreateIterator();
 8 }
 9 
10 /// <summary>
11 /// 作用是保存数据,保存的数据是一系列数据,所以用数组
12 /// 然后传输数据给ConcreteIterator
13 /// </summary>
14 class ConcreteAggregate : Aggregate
15 {
16     //用于存放聚合对象
17     private IList<object> items = new List<object>();
18     public override Iterator CreateIterator()
19     {
20         return new ConcreteIterator(this);
21     }
22     //数组的长度,也就是ConcreteAggregate的属性
23     public int Count { get { return items.Count; } }
24     /// ConcreteAggregate现在是数组形式
25     /// get获取当前的数据
26     /// set将新来的数据插入到ConcreteAggregate中
27     public object this[int index]
28     {
29         get { return items[index]; }
30         set { items.Insert(index, value); }
31     }
32 } 

主函数调用:

 1 static void Main(string[] args)
 2 {
 3     ConcreteAggregate a = new ConcreteAggregate();
 4     a[0] = "A";
 5     a[1] = "B";
 6     a[2] = "C";
 7     a[3] = "D";
 8     a[4] = "E";
 9     a[5] = "F";
10 
11     Iterator i = new ConcreteIterator(a);
12     object item = i.First();
13     while (!i.IsDone())
14     {
15         Console.WriteLine("{0} buy ticket,please", i.CurrentItem());
16         i.Next();
17     }
18 
19     Iterator id = new ConcreteIteratorDesc(a);
20     object itemdec = id.First();
21     while (!id.IsDone())
22     {
23         Console.WriteLine("{0} buy ticket,please", id.CurrentItem());
24         id.Next();
25     }
26 
27     Console.Read();
28 } 

.NET的迭代器实现

  迭代器模式在我们现在的使用中其实没有那么麻烦,因为.NET框架已经准备好了相关的接口,只需要实现就好了。

 1 static void Main(string[] args)
 2 {
 3     IList<string> a = new List<string>();
 4 
 5     a.Add("A");
 6     a.Add("B");
 7     a.Add("C");
 8     a.Add("D");
 9     a.Add("E");
10     a.Add("F");
11 
12     //看见遍历首先考虑foreach
13     foreach (string item in a)
14     {
15         Console.WriteLine("{0} buy ticket,please", item);
16     }
17     //支持在泛型集合上进行简单迭代。
18     IEnumerator<string> e = a.GetEnumerator();
19     while (e.MoveNext())
20     {
21         Console.WriteLine("{0} buy ticket,please", e.Current);
22     }
23 
24     Console.Read();
25 } 

 补充:IEnumerator

  

 

 

备注:文中所有代码及知识点均来自于《大话设计模式》,本人属于边学边看边敲代码边总结的阶段。

posted @ 2017-11-28 17:38  多多陪着小五  阅读(362)  评论(0编辑  收藏  举报