迭代器模式

来源:互联网 发布:gcr.io 阿里云 编辑:程序博客网 时间:2024/06/08 03:56


大概可以理解为,左边是存储好的元素,右边是迭代器,用于访问这些元素。

左边的类需要右边的构造函数来生成右边的具体迭代器对象,所以具体Aggregate类依赖于具体迭代器类。同时具体迭代器类访问元素需要在类里面定义一个具体Aggregate对象,所以他们之间有关联关系,且箭头指向具体Aggregate类。



using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace 迭代器模式{    abstract class Iterator    {        public abstract object First();        public abstract object Next();        public abstract bool IsDone();        public abstract object CurrentItem();    }    abstract class Aggregate    {        public abstract Iterator CreateIterator();    }    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 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 object CurrentItem()        {            return aggregate[current];        }        public override bool IsDone()        {            return current >= aggregate.Count ? true : false;        }    }    class Program    {        static void Main(string[] args)        {            ConcreteAggregate ret = new ConcreteAggregate();            ret[0] = 1; ret[1] = "second"; ret[2] = 333;            Iterator lst = ret.CreateIterator();            Console.WriteLine(lst.First());            Console.WriteLine(lst.CurrentItem());            Console.WriteLine(lst.Next());            Console.WriteLine(lst.CurrentItem());            Console.WriteLine(lst.IsDone());            Console.WriteLine(lst.Next());            Console.WriteLine(lst.IsDone());            Console.WriteLine(lst.Next());            Console.WriteLine(lst.IsDone());        }    }}



原创粉丝点击