设计模式17:Iterator 迭代器模式(行为型模式)
Iterator 迭代器模式(行为型模式)
动机(Motivation)
在软件构建过程中,集合对象内部结构常常变化各异。但对于这些集合对象,我们希望在不暴露其内部结构的同时,可以让外部客户代码可以透明地访问其包含的元素;同时这种“透明变量”也为“同一种算法在多种集合对象上进行操作”提供了可能。
使用面向对象技术使这种遍历机制抽象为“迭代器对象”为“应对变化中的集合对象”提供了一种优雅的方式。
意图(Intent)
提供一种方法顺序访问一个聚合对象中各个元素 , 而又不需暴露该对象的内部表示。——《设计模式》GoF
结构(Structure)
示例代码
abstract class Iterator//抽象迭代器 { public abstract object First(); public abstract object Next(); public abstract bool IsDone(); public abstract object CurrentItem(); } abstract class Aggregate//抽象聚集类 { public abstract Iterator CreateIterator();//创建迭代器 } class ConcreteAggregate : Aggregate//具体聚集类 { private IList<object> items=new List<object>(); public override Iterator CreateIterator() { return new ConcreteIterator(this); } public int Count { get { return items.Count; } } //声明一个索引器 public object this[int index] { get { return items[index]; } set{items.Insert(index,value);} } } class ConcreteIterator : Iterator//具体迭代器 { private ConcreteAggregate aggregate; private int current = 0; public ConcreteIterator(ConcreteAggregate aggregate)//初始化时将具体的聚集对象传入 { this.aggregate = aggregate; } public override object First() { return aggregate[0];//得到聚集的第一个对象 } public override object Next() { object ret = null; current++; if (current < aggregate.Count) { ret = aggregate[current]; } return ret; } public override bool IsDone() { return current >= aggregate.Count; } public override object CurrentItem() { return aggregate[current]; } }
客户端调用:
static void Main(string[] args) { ConcreteAggregate a = new ConcreteAggregate(); a[0] = "大鸟"; a[1] = "小菜"; a[2] = "沙发"; a[3] = "板凳"; Iterator iterator = new ConcreteIterator(a); while (!iterator.IsDone()) { Console.WriteLine(iterator.CurrentItem()); iterator.Next(); } Console.ReadKey(); }
输出:
大鸟
小菜
沙发
板凳
Iterator模式的几个要点
- 迭代抽象:访问一个聚合对象的内部而无需暴露它的内部表示。
- 迭代多态:为遍历不同的集合结构提供一个统一的接口,从而支持同样的算法在不同的集合结构上进行操作。
- 迭代器的健壮性考虑:遍历的同时更改迭代器所在的集合结构,会导致问题。
转载请注明出处: