C#设计模式之迭代器模式

前言

介绍比较少,直接看代码吧。也是一个很容易懂的模式~

迭代器模式

英文:Iterator
what:
提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。

场景

坐火车时检票人员会遍历车厢的每一个人,不放过任何一个不买票的乘客。这就体现了迭代器模式。

应用

当你访问一个聚集对象,而且不管这些对象是什么都需要遍历的时候,就可以考虑迭代器模式。
需要对聚集有多种 方式遍历时,也可以考虑迭代器模式。

代码展示

迭代器抽象类:

 //迭代器抽象类

    abstract class Iterator
    {
        //用于定义1234统一接口
        public abstract object First();//1开始对象
        public abstract object Next();//2得到下一个对象
        public abstract bool IsDone();//3判断是否到结尾
        public abstract object CurrentItem();//4当前对象
    }

聚集抽象类:

//聚集抽象类

    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 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()//判断当前是否遍历到结尾,到结尾返回true
        {
            return current >= aggregate.Count ? true : false;
        }

        public override object CurrentItem()
        {
            return aggregate[current];//返回当前的聚集对象
        }
    }

具体聚集类:继承聚集抽象类:

//具体聚集类

    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); }
        }
    }

客户端代码:

 class Program
    {
        static void Main(string[] args)
        {
            ConcreteAggregate monkey = new ConcreteAggregate();

            monkey[0] = "猴子";
            monkey[1] = "刘木同";
            monkey[2] = "笨蛋";
            monkey[3] = "小弟";
            monkey[4] = "领导";
            monkey[5] = "内部人员";
            monkey[6] = "小偷";

            Iterator i = new ConcreteIterator(monkey);
            object item = i.First();//从第一个乘客开始
            while (!i.IsDone())
            {
                Console.WriteLine("{0}请买火车票",i.CurrentItem ());//若没买票,请补票
                i.Next();//遍历下一个
            }

            Console.Read();
        }
    }

图示效果:

迭代器模式

后记

敲完了这个就想到了适配器模式。感觉这两个模式都是很好用也挺简单的。设计模式很重要也是一个很有实践力的学习模块,以后还会再深入学习的~

猜你喜欢

转载自blog.csdn.net/carrie_q/article/details/80580882