提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。
适用性
- 访问一个聚合对象的内容而无需暴露它的内部标识。
- 支持对聚合对象的多种遍历
- 为遍历不同的聚合结构提供一个统一的接口(即,支持多态迭代)
参与者
Iterator
——迭代器定义访问和遍历元素的接口
ConcreteIterator
——具体迭代器实现迭代接口
——対该聚合遍历的时候跟踪当前位置
Aggregate
——聚合定义创建相应的迭代器对象的接口
ConcreteAggregate
——具体聚合实现创建相应迭代器的接口,该操作返回ConcreteIterator的一个是适当的实例
1 // 抽象聚合类 2 public interface IListCollection 3 { 4 Iterator GetIterator(); 5 }
1 // 迭代器抽象类 2 public interface Iterator 3 { 4 bool MoveNext(); 5 Object GetCurrent(); 6 void Next(); 7 void Reset(); 8 }
1 // 具体聚合类 2 public class ConcreteList : IListCollection 3 { 4 int[] collection; 5 public ConcreteList() 6 { 7 collection = new int[] { 2, 4, 6, 8 }; 8 } 9 10 public Iterator GetIterator() 11 { 12 return new ConcreteIterator(this); 13 } 14 15 public int Length 16 { 17 get { return collection.Length; } 18 } 19 20 public int GetElement(int index) 21 { 22 return collection[index]; 23 } 24 }
1 // 具体迭代器类 2 public class ConcreteIterator : Iterator 3 { 4 // 迭代器要集合对象进行遍历操作,自然就需要引用集合对象 5 private ConcreteList _list; 6 private int _index; 7 8 public ConcreteIterator(ConcreteList list) 9 { 10 _list = list; 11 _index = 0; 12 } 13 14 15 public bool MoveNext() 16 { 17 if (_index < _list.Length) 18 { 19 return true; 20 } 21 return false; 22 } 23 24 public Object GetCurrent() 25 { 26 return _list.GetElement(_index); 27 } 28 29 public void Reset() 30 { 31 _index = 0; 32 } 33 34 public void Next() 35 { 36 if (_index < _list.Length) 37 { 38 _index++; 39 } 40 41 } 42 }
1 // 客户端 2 class Program 3 { 4 static void Main(string[] args) 5 { 6 Iterator iterator; 7 IListCollection list = new ConcreteList(); 8 iterator = list.GetIterator(); 9 10 while (iterator.MoveNext()) 11 { 12 int i = (int)iterator.GetCurrent(); 13 Console.WriteLine(i.ToString()); 14 iterator.Next(); 15 } 16 17 Console.Read(); 18 } 19 }
.NET中迭代器模式的应用
在.NET下,迭代器模式中的聚集接口和迭代器接口都已经存在了,其中IEnumerator接口扮演的就是迭代器角色,IEnumberable接口则扮演的就是抽象聚集的角色,只有一个GetEnumerator()方法,关于这两个接口的定义可以自行参考MSDN。在.NET 1.0中,.NET 类库中很多集合都已经实现了迭代器模式,大家可以用反编译工具Reflector来查看下mscorlib程序集下的System.Collections命名空间下的类,这里给出ArrayList的定义代码,具体实现代码可以自行用反编译工具查看,具体代码如下所示:
1 public class ArrayList : IList, ICollection, IEnumerable, ICloneable 2 { 3 // Fields 4 private const int _defaultCapacity = 4; 5 private object[] _items; 6 private int _size; 7 [NonSerialized] 8 private object _syncRoot; 9 private int _version; 10 private static readonly object[] emptyArray; 11 12 public virtual IEnumerator GetEnumerator(); 13 public virtual IEnumerator GetEnumerator(int index, int count); 14 15 // Properties 16 public virtual int Capacity { get; set; } 17 public virtual int Count { get; } 18 ..............// 更多代码请自行用反编译工具Reflector查看 19 }
学习于 http://www.cnblogs.com/zhili/p/IteratorPattern.html