c#设计模式-行为性模式-3.迭代器模式

Posted mr.chenyuelin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c#设计模式-行为性模式-3.迭代器模式相关的知识,希望对你有一定的参考价值。

迭代器模式的实现:提供一种方法顺序访问1个聚合对象(类)的各个元素,而不暴露内部的表示

先看下数组的遍历:

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 迭代器模式
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] arr = { 2, 3, 5, 5 };
            IEnumerator ie = arr.GetEnumerator();
            foreach (int item in arr)
            {
                Console.WriteLine(item);
            }
			//内部迭代器实现过程
            int[] arr1 = { 2, 3, 5, 5 };
            IEnumerator ie2 = arr.GetEnumerator();
            while(ie2.MoveNext())
            {
                int i = (int)ie2.Current;
                Console.WriteLine(i);
            }
            Console.ReadKey();
        }
    }
}

为什么数组能够通过foreach遍历呢?原因是数组实现了IEnumerable接口,IEumerable接口中只有一个成员方法:GetEnumerator(),这个方法返回一个枚举器对象,这个枚举器就是迭代器模式中的迭代器。我们可以通过GetEnumerator方法获取枚举器对象。那么什么是枚举器呢?实现IEnumerator接口的类型就是枚举器,该接口有三个成员:

current :获取当前位置元素
   MoveNext() :把枚举器位置前进到下一项,返回bool,表示位置是否有效
   Reset() :把位置重置为原始状态的位置(有索引是一般为-1)

我们就可以自己实现一个可以用foreach遍历的类了:自定义的类要实现IEnumerable接口的GetEnumerator方法,这个方法返回一个枚举器(就是一个继承IEnumerator接口的类型),以遍历自定义颜色集合为例,代码如下:

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 迭代器模式
{
    class ColorList : IEnumerable
    {
        //实现IEnumerable的接口
        public IEnumerator GetEnumerator()
        {
            return new ColorEnumerator(new string[] { "red", "green", "pink" });
        }
    }

    class ColorEnumerator : IEnumerator
    {
        private string[] colors;

        private int index = -1;

        public ColorEnumerator(string[] v)
        {
            this.colors = new string[v.Length];
            for (int i = 0; i < colors.Length; i++)
            {
                colors[i] = v[i];
            }
        }
        //获取当前的值
        public object Current
        {
            get
            {
                if (index < 0 || index > colors.Length - 1)
                {
                    throw new Exception("数组越界");
                }
                return colors[index];
            }
        }
        //指向下一个
        public bool MoveNext()
        {
            if(index<colors.Length - 1)
            {
                index++;
                return true;
            }
            return false;
        }
        //重置
        public void Reset()
        {
            index = -1;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            ColorList colorList = new ColorList();
            //遍历自定义类
            foreach (var item in colorList)
            {
                Console.WriteLine(item);
            }
            Console.ReadKey();
        }
    }
}

理解上面之后,我们使用迭代器时,不用我们自己去手动创建IEnumerator实例,编译器会自动帮我们生成IEnumerator内部的Current,MoveNext和Reset方法。使用迭代器上边的例子可以简化为:

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 迭代器模式
{
    class ColorList : IEnumerable
    {
        //实现IEnumerable的接口
        public IEnumerator GetEnumerator()
        {
            //return new ColorEnumerator(new string[] { "red", "green", "pink" });
            string[] colors = { "red", "green", "pink" };
            for (int i = 0; i < colors.Length; i++)
            {
                yield return colors[i];
            }
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            ColorList colorList = new ColorList();
            //遍历自定义类
            foreach (var item in colorList)
            {
                Console.WriteLine(item);
            }
            Console.ReadKey();
        }
    }
}

简单记忆:迭代器模式就是实现自定义类的遍历

以上是关于c#设计模式-行为性模式-3.迭代器模式的主要内容,如果未能解决你的问题,请参考以下文章

详解C# 迭代器

行为型设计模式之迭代器模式

行为型模式-迭代器模式

Python 设计模式 — 行为型模式 — 迭代器模式

设计模式迭代器模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

Python 设计模式 — 行为型模式 — 迭代器模式