本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/7903617.html,记录一下学习过程以备后续查用。

    一、引言

    今天我们要讲行为型设计模式的第三个模式--迭代器模式,先从名字上来看。迭代是遍历的意思,迭代器可以理解为是遍历某某的工具,遍历什么呢?在软

件设计中,当然遍历的是集合对象,所以说迭代器模式是遍历集合的一种通用的算法。如果集合只有一种类型,那这个模式就没用了,就是因为集合对象包含

数组、列表、字典和哈希表等各种对象。如果为每一种集合对象都实现一套遍历算法,也不太现实,因此为了解决遍历集合有一个统一的接口这个事情,所以

就提出了“迭代器”这个模式。

    二、迭代器模式介绍

    迭代器模式:英文名称--Iterator Pattern;分类--行为型。

    2.1、动机(Motivate)

    在软件构建过程中,集合对象内部结构常常变化各异。但对于这些集合对象,我们希望在不暴露其内部结构的同时,可以让外部客户代码透明地访问其中包

含的元素,同时这种“透明遍历”也为“同一种算法在多种集合对象上进行操作”提供了可能。

    使用面向对象技术将这种遍历机制抽象为“迭代器对象”为“应对变化中的集合对象”提供了一种优雅的方式。

    2.2、意图(Intent)

    提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示。——《设计模式》GoF

    2.3、结构图

C#设计模式学习笔记:(15)迭代器模式

    2.4、模式的组成

    从迭代器模式的结构图可以看出,它涉及到四个角色,它们分别是:

    1)抽象迭代器(Iterator):抽象迭代器定义了访问和遍历元素的接口,一般声明以下方法:用于获取第一个元素的first()、用于访问下一个元素的next()、用于

判断是否还有下一个元素的hasNext()、用于获取当前元素的currentItem(),在其子类中将实现这些方法。

    2)具体迭代器(ConcreteIterator):具体迭代器实现了抽象迭代器接口,完成对集合对象的遍历,同时在对聚合进行遍历时跟踪其当前位置。

    3)抽象聚合类(Aggregate):抽象聚合类用于存储对象,并定义创建相应迭代器对象的接口,声明一个createIterator()方法用于创建一个迭代器对象。

    4)具体聚合类(ConcreteAggregate):具体聚合类实现了创建相应迭代器的接口,实现了在抽象聚合类中声明的createIterator()方法,并返回一个与该具体聚

合相对应的具体迭代器ConcreteIterator实例。

    2.5、迭代器模式的具体实现

    迭代器模式在现实生活中也有类似的例子,比如:在部队中,我们可以让某一队伍当中的某人出列,或者让队列里面的每个人依次报名,其实这个过程就是

一个遍历的过程。具体实现代码如下:

    class Program
    {
        /// <summary>
        /// 部队队列的抽象聚合类--该类型相当于抽象聚合类Aggregate
        /// </summary>
        public interface ITroopQueue
        {
            IIterator GetIterator();
        }

        /// <summary>
        /// 迭代器抽象类
        /// </summary>
        public interface IIterator
        {
            bool MoveNext();
            object GetCurrent();
            void Next();
            void Reset();
        }

        /// <summary>
        /// 部队队列具体聚合类--相当于具体聚合类ConcreteAggregate
        /// </summary>
        public sealed class ConcreteTroopQueue : ITroopQueue
        {
            private string[] collection;

            public ConcreteTroopQueue()
            {
                collection = new string[] { "黄飞鸿", "方世玉", "洪熙官", "严咏春" };
            }

            public IIterator GetIterator()
            {
                return new ConcreteIterator(this);
            }

            public int Length
            {
                get { return collection.Length; }
            }

            public string GetElement(int index)
            {
                return collection[index];
            }
        }

        /// <summary>
        /// 具体迭代器类
        /// </summary>
        public sealed class ConcreteIterator : IIterator
        {
            //迭代器要对集合对象进行遍历操作,自然就需要引用集合对象。
            private ConcreteTroopQueue _list;
            private int _index;

            public ConcreteIterator(ConcreteTroopQueue list)
            {
                _list = list;
                _index = 0;
            }

            public bool MoveNext()
            {
                if (_index < _list.Length)
                {
                    return true;
                }
                return false;
            }

            public Object GetCurrent()
            {
                return _list.GetElement(_index);
            }

            public void Reset()
            {
                _index = 0;
            }

            public void Next()
            {
                if (_index < _list.Length)
                {
                    _index++;
                }
            }
        }

        static void Main(string[] args)
        {
            #region 迭代器模式
            IIterator iterator;
            ITroopQueue list = new ConcreteTroopQueue();
            iterator = list.GetIterator();
            while (iterator.MoveNext())
            {
                string name = (string)iterator.GetCurrent();
                Console.WriteLine(name);
                iterator.Next();
            }

            Console.Read();
            #endregion
        }
    }
View Code

相关文章: