迭代器模式(Iterator)
迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。
当你需要访问一个聚集对象,而且不管这些对象是什么都需要遍历的时候,就可以考虑使用迭代器模式。
迭代器为遍历不同的聚集结构提供如:开始、下一个、是否结束、当前哪一项等统一的接口。
此外,可以知悉,基本上所有的高级语言都封装了迭代器的实现,直接将此模式做在了语言当中。
如:Foreach in(C#),IEnumerable接口等
为什么将迭代器抽象成接口?
迭代方式的不同,可以使用不同的迭代器进行迭代
比如说我想要实现从后往前迭代——就可以通过实现迭代器接口实现
这样允许对聚集有多种方式遍历——可以考虑使用迭代器模式。
迭代器模式结构图

迭代器模式成员分析
聚集Aggregatee,
迭代器Iterator,
迭代器代码结构
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
| 代码实现:
abstract class Iterator { public abstract object First(); public abstract object Next(); public abstract bool IsDone(); public abstract object CurItem();
}
abstract class Aggregate { public abstract Iterator CreateIterator(); }
class ConcreteIterator : Iterator { private ConcreteAggregate aggregate; private int current = 0;
public ConcreteIterator(ConcreteAggregate aggregate) { this.aggregate = aggregate; }
public override object CurItem() { return aggregate[current]; }
public override object First() { return aggregate[0]; }
public override bool IsDone() { return current >= aggregate.Count ? true : false; }
public override object Next() { object ret = null; current++; if(current<aggregate.Count) { ret = aggregate[current]; } return ret; } }
class ConcreteAggregate : Aggregate { private IList<Object> items = new List<object>();
public int Count { get { return items.Count; } }
public override Iterator CreateIterator() { return new ConcreteIterator(this); }
public object this[int index] { get { return items[index]; } set {items.Insert(index,value); } } }
ConcreteAggregate a = new ConcreteAggregate(); a[0] = "迭代0"; a[1] = "迭代1"; a[2] = "迭代2";
Iterator i = new ConcreteIterator(a); object item = i.First(); while (!i.IsDone()) { Console.WriteLine(i.CurItem()); i.Next(); }
|
迭代器模式总结