今天咱们一块儿看看行为模式中的迭代器模式,迭代是重复反馈过程的活动,其目的一般是为了接近并到达所需的目标或结果。在系统开发中简单说能够理解成遍历。这种模式用于顺序访问集合对象的元素,不须要知道集合对象的底层或者内部表示。html
在系统开发中,集合对象内部表示各不相同。底层构造也尽不相同。对于这些对象,咱们但愿在不暴露其底层和内部表示的同时,可使外部客户访问其中元素。迭代器模式就为这一需求提供了极其优雅的实现。设计模式
提供一种方法顺序访问一个聚合对象中各个元素, 而又无须暴露该对象的内部表示。this
咱们从上面的案例图可见,迭代器模式主要包含如下四个部分:spa
抽象迭代器:定义了访问和遍历元素的接口,而后在其子类中实现这些方法。设计
具体迭代器:实现抽象迭代器接口,完成对集合对象的遍历。同时对遍历时的位置进行跟踪。code
抽象聚合类:主要用于储存对象,建立相应的迭代器对象的接口。带有一个createIterator()方法用于建立迭代器对象。htm
具体聚合类:实现建立相应的迭代器对象的接口,实现createIterator()方法,而且返回与该具体聚合相对应的具体迭代器ConcreteIterator实例。对象
介绍完迭代器模式以后,接下来咱们具体来看看迭代器模式的具体实现吧。具体以下:blog
namespace Iterator_Pattern { class IteratorPattern { } /// <summary> /// 抽象聚合类、包含一个建立迭代器对象的方法 /// </summary> public interface IListAggregate { Iterator GetIterator(); } /// <summary> /// 抽象迭代器、包含访问和遍历元素的方法 /// </summary> public interface Iterator { /// <summary> /// 是否有下一个元素 /// </summary> /// <returns></returns> bool IsNext(); /// <summary> /// 获取当前元素位置 /// </summary> /// <returns></returns> object GetCurrentIndex(); /// <summary> /// 获取下一个元素 /// </summary> void Next(); /// <summary> /// 获取第一个元素、至关于重置 /// </summary> void Start(); } /// <summary> /// 具体聚合类 /// </summary> public class ConcreteListAggregate : IListAggregate { string[] list; public ConcreteListAggregate() { list = new string[] { "张三", "李四", "王五", "赵六" }; } /// <summary> /// 建立迭代器对象 /// </summary> /// <returns></returns> public Iterator GetIterator() { return new ConcreteIterator(this); } /// <summary> /// 获取对象长度 /// </summary> public int Length { get { return list.Length; } } /// <summary> /// 获取指定位置元素 /// </summary> /// <param name="index"></param> /// <returns></returns> public object GetItem(int index) { return list[index]; } } public class ConcreteIterator : Iterator { private ConcreteListAggregate _list; private int _index; public ConcreteIterator(ConcreteListAggregate list) { _list = list; _index = 0; } public object GetCurrentIndex() { return _list.GetItem(_index); } public bool IsNext() { if (_index<_list.Length) { return true; } return false; } public void Next() { if (_index<_list.Length) { _index++; } } public void Start() { _index = 0; } } }
namespace Iterator_Pattern { class Program { static void Main(string[] args) { //获取迭代器对象 IListAggregate listAggregate = new ConcreteListAggregate(); Iterator iterator = listAggregate.GetIterator(); while (iterator.IsNext()) { var result = iterator.GetCurrentIndex(); Console.WriteLine(result); iterator.Next(); } } } }
一、访问聚合对象的内容不须要暴露其内部表示。教程
二、须要为聚合对象提供多种遍历方式。
三、为了遍历不一样的聚合结构对象提供统一的接口
一、访问聚合对象内容时无需暴露其内部表示。
二、迭代器模式为不一样的聚合结构对象提供了统一的接口。
三、在同一个聚合对象上能够实现多种遍历。
四、增长新的聚合类和迭代类较为方便,无需修改以前的代码
1、迭代器模式将存储数据和遍历数据的责任进行了分离。增长新的聚合类型的时候须要增长新的迭代器类。存在成对增长的。增长了系统的复杂性。
迭代器模式到这里就介绍完了。迭代器模式就是经过迭代器类将集合对象的遍历行为进行区分开来。这样一来就能够不暴露集合对象的内部表示了。又可使外部能正常的使用访问其元素。这个模式并不复杂。把握好其中每一个角色的职责,进行连贯就行了。在.Net中咱们也能够发现一个现成的迭代器模式。这也是最好的教程案例。IEnumerable做为了一个抽象聚合类、IEnumerator做为一个抽象迭代器。在System.Collections命名空间之下。有兴趣深究的能够去研究下。
一我的如若不能使本身的人生辉煌,但也没有理由使它黯淡;人生能够平凡,但不能够庸俗、堕落;人生不在意掠取多少,而在于追求过程的完美与卓越!
欢迎你们扫描下方二维码,和我一块儿踏上设计模式的闯关之路吧!