迭代器模式:是编程环境中非常常用的设计模式。这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。迭代器模式属于行为型模式。
主要意图:提供一种方法顺序访问一个聚合对象中各个元素, 而又无须暴露该对象的内部表示。
主要解决:不同的方式来遍历整个整合对象。
解决方案:把在元素之间游走的责任交给迭代器,而不是聚合对象。
优点:
1、它支持以不同的方式遍历一个聚合对象。
2、迭代器简化了聚合类。
3、在同一个聚合上可以有多个遍历。
4、在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码。
缺点:
由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性。
迭代器类图:
代码实现:
客户端代码:
using System; namespace _01迭代器模式_基础模型 { class Program { static void Main(string[] args) { ConcreteAggregate a = new ConcreteAggregate(); a[0] = "大鸟"; a[1] = "小菜"; a[2] = "行李"; a[3] = "老外"; a[4] = "公交内部员工"; a[5] = "小偷"; //反向遍历 Iterator i = new ConcreteIteratorDesc(a); //正向遍历 //Iterator i = new ConcreteIterator(a); object item = i.First(); while(!i.IsDone()) { Console.WriteLine("{0} 请买票!", i.CurrentItem()); i.Next(); } Console.Read(); } } }
抽象聚合接口(合计):
using System; using System.Collections.Generic; using System.Text; namespace _01迭代器模式_基础模型 { /// <summary> /// 合计 /// </summary> abstract class Aggregate { //创建迭代器 public abstract Iterator CreateIterator(); } }
抽象迭代器接口:
using System; using System.Collections.Generic; using System.Text; namespace _01迭代器模式_基础模型 { abstract class Iterator { public abstract object First(); public abstract object Next(); //网络释义:完成 public abstract bool IsDone(); public abstract object CurrentItem(); } }
具体迭代器接口:
using System; using System.Collections.Generic; using System.Text; namespace _01迭代器模式_基础模型 { 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 ? true : false; } public override object CurrentItem() { return aggregate[current]; } } }
另一个接口:
using System; using System.Collections.Generic; using System.Text; namespace _01迭代器模式_基础模型 { class ConcreteIteratorDesc:Iterator { private ConcreteAggregate aggregate; private int current = 0; public ConcreteIteratorDesc(ConcreteAggregate aggregate) { this.aggregate = aggregate; current = aggregate.Count - 1; } public override object First() { return aggregate[aggregate.Count - 1]; } public override object Next() { object ret = null; current--; if (current >=0) { ret = aggregate[current]; } return ret; } public override object CurrentItem() { return aggregate[current]; } public override bool IsDone() { return current < 0 ? true : false; } } }
具体聚合:
using System; using System.Collections.Generic; using System.Text; namespace _01迭代器模式_基础模型 { 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); } } } }
总结:迭代器模式可以控制外部访问容器内部数据的顺序。