迭代器模式(Iterator)

来源:互联网 发布:互冠网络手游雄霸天下 编辑:程序博客网 时间:2024/04/30 13:20

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

       当你需要访问一个聚合对象,而且不管这些对象是什么都需要遍历的时候,就应该考虑使用迭代器模式。另外,当需要对聚集有多种方式遍历时,可以考虑去使用迭代器模式。迭代器模式为遍历不同的聚集结构提供如开始、下一个、是否结束、当前哪一项等统一的接口。

迭代器模式UML类图:


迭代器模式实现:

[csharp] view plaincopyprint?
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5.   
  6. namespace Iterator  
  7. {  
  8.     /*Iterator迭代器抽象类*/  
  9.     abstract  class Iterator  
  10.     {  
  11.         public abstract object First();  
  12.         public abstract object Next();  
  13.         public abstract object CurrentItem();  
  14.         public abstract bool IsDone();  
  15.     }  
  16.     /*Aggregate聚集抽象类*/  
  17.     abstract class Aggregate  
  18.     {  
  19.         public abstract Iterator createIterator();  
  20.     }  
  21.   
  22.     class ConcreteIterator : Iterator  
  23.     {  
  24.       
  25.         // 定义了一个具体聚集对象      
  26.         private ConcreteAggregate aggregate;  
  27.   
  28.         private int current = 0;  
  29.       
  30.         // 初始化对象将具体聚集类传入  
  31.         public ConcreteIterator(ConcreteAggregate aggregate)  
  32.         {  
  33.             this.aggregate = aggregate;  
  34.         }  
  35.   
  36.         // 第一个对象  
  37.         public override object First()  
  38.         {  
  39.             return aggregate[0];  
  40.         }  
  41.   
  42.         // 得到聚集的下一对象  
  43.         public override object Next()  
  44.         {  
  45.             object ret = null;  
  46.             current++;  
  47.             if (current < aggregate.Count)  
  48.             {  
  49.                 ret = aggregate[current];  
  50.             }  
  51.             return ret;  
  52.         }  
  53.   
  54.         // 是否到结尾     
  55.         public override bool IsDone()  
  56.         {  
  57.             return current >= aggregate.Count ? true : false;  
  58.         }  
  59.   
  60.         // 返回当前聚集对象  
  61.         public override object CurrentItem()  
  62.         {  
  63.             return aggregate[current];  
  64.         }  
  65.     }  
  66.   
  67.     class ConcreteAggregate : Aggregate  
  68.     {  
  69.         private IList<object> items = new List<object>();  
  70.   
  71.         public override Iterator createIterator()  
  72.         {  
  73.             return new ConcreteIterator(this);  
  74.         }  
  75.   
  76.         // 返回聚集总个数  
  77.         public int Count  
  78.         {  
  79.             get { return items.Count; }  
  80.         }  
  81.   
  82.         // 声明一个索引器  
  83.         public object this[int index]  
  84.         {  
  85.             get { return items[index]; }  
  86.             set { items.Insert(index, value); }  
  87.         }  
  88.     }  
  89. }  
客户端:

[csharp] view plaincopyprint?
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5.   
  6. namespace Iterator  
  7. {  
  8.     class Program  
  9.     {  
  10.         static void Main(string[] args)  
  11.         {  
  12.             ConcreteAggregate ca = new ConcreteAggregate();  
  13.             ca[0] = "大鸟";  
  14.             ca[1] = "小菜";  
  15.             ca[2] = "行李";  
  16.             ca[3] = "老外";  
  17.             ca[4] = "公交内部员工";  
  18.             ca[5] = "小偷";  
  19.   
  20.             Iterator i = new ConcreteIterator(ca);  
  21.             object obj = i.First();  
  22.             while (!i.IsDone())  
  23.             {  
  24.                 Console.WriteLine("{0}  请买车票!",i.CurrentItem());  
  25.                 i.Next();  
  26.             }  
  27.             Console.Read();  
  28.         }  
  29.     }  
  30. }  
运行结果:



.NET的迭代器实现:

       其实.net框架已经准备好了迭代器接口,只需要实现接口就行了IEumerator 支持对非泛型集合的简单迭代。

[csharp] view plaincopyprint?
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5.   
  6. namespace Iterator.Net  
  7. {  
  8.     public interface IEumerator  
  9.     {  
  10.         object Current  
  11.         {  
  12.             get;  
  13.         }  
  14.   
  15.         bool MoveNext();  
  16.   
  17.         void Reset();  
  18.     }  
  19.   
  20.     public interface IEnumerable  
  21.     {  
  22.         IEnumerable GetEnumerator();  
  23.     }  
  24.   
  25. }  

客户端:

[csharp] view plaincopyprint?
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5.   
  6. namespace Iterator.Net  
  7. {  
  8.     class Program  
  9.     {  
  10.         static void Main(string[] args)  
  11.         {  
  12.             IList<string> ca = new List<string>();  
  13.             ca.Add("大鸟");  
  14.             ca.Add("小菜");  
  15.             ca.Add("行李");  
  16.             ca.Add("老外");  
  17.             ca.Add("公交内部员工");  
  18.             ca.Add("小偷");  
  19.   
  20.             foreach (string item in ca)  
  21.             {  
  22.                 Console.WriteLine("{0} 请买车票!",item);  
  23.             }  
  24.   
  25.             Console.Read();  
  26.         }  
  27.     }  
  28. }  

运行结果:



迭代器模式总结:

       迭代器模式(Iterator)就是分离了聚合对象的遍历行为,抽象出一个迭代器来负责这样既可以做到不暴露集合的内部结构,又可让外部代码透明的访问集合内部数据。

0 0
原创粉丝点击