提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示。[GOF 《设计模式》]
在面向对象的软件设计中,我们经常会遇到一类集合对象,这类集合对象的内部结构可能有着各种各样的实现,
但是归结起来,无非有两点是需要我们去关心的:一是集合内部的数据存储结构,二是遍历集合内部的数据。
面向对象设计原则中有一条是类的单一职责原则,所以我们要尽可能的去分解这些职责,用不同的类去承担不同的职责。
Iterator模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可让外部代码透明的访问集合内部的数据。
代码1:迭代器
public interface IIterator { bool MoveNext(); Object CurrentItem(); void First(); void Next(); } public class ConcreteIterator : IIterator { private ConcreteList list; private int index; public ConcreteIterator(ConcreteList list) { this.list = list; index = 0; } public bool MoveNext() { if (index < list.Length) return true; else return false; } public Object CurrentItem() { return list.GetElement(index) ; } public void First() { index = 0; } public void Next() { if (index < list.Length) { index++; } } }
代码2:聚合类
public interface IList { IIterator GetIterator(); } public class ConcreteList : IList { int[] list; public ConcreteList() { list = new int[] { 1,2,3,4,5}; } public IIterator GetIterator() { return new ConcreteIterator(this); } public int Length { get { return list.Length; } } public int GetElement(int index) { return list[index]; } }
代码3:客户端代码
class Program { static void Main(string[] args) { IIterator iterator; IList list = new ConcreteList(); iterator = list.GetIterator(); while (iterator.MoveNext()) { int i = (int)iterator.CurrentItem(); Console.WriteLine(i.ToString()); iterator.Next(); } Console.Read(); } }