天天看點

疊代器模式疊代器模式:結構圖:代碼:

疊代器模式:

    提供一種順序通路聚合對象中各個元素的方法,同時又不暴露該對象的内部表示(結構),又可以讓外邊代碼通路集合内部的資料(如下面例子中的“提示某人買票”),疊代器模式 分離了 集合對象的周遊行為 。

    為周遊  不同的聚集結構  提供 如:開始、下一個、是否結束、目前哪一項 等 (統一的)接口

适用場景:

通路聚集對象,不管對象是什麼 都 需要周遊的時候

需要對聚集有多種方式周遊時(售票員查票:從頭到尾、從尾到頭)

結構圖:

疊代器模式疊代器模式:結構圖:代碼:

代碼:

namespace 疊代器模式
{
    class Program
    {
        static void Main(string[] args)
        {
            ConcreteAggregate a = new ConcreteAggregate();
            a[0] = "Cindy";
            a[1] = "DIDDy";
            a[2] = "Sendy";
            a[3] = "Filed";
            a[4] = "Oilded";
            a[5] = "Hilded";

            Iterator i = new ConcreteIterator(a);//聲明疊代器
            object item=i.First ();
            while (! i.IsDone ())
            {
                Console.WriteLine("\n{0}請買票",i.CurrentItem ());
                i.Next ();
            }
            Console .Read ();
        }
    }
    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 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()
        {
            return current >= aggregate.Count ? true : false;
        }
        public override object CurrentItem()
        {
            return aggregate[current];//傳回目前聚集對象
        }
    }
    class ConcreteAggregate :Aggregate
    {
        //聲明一個IList泛型變量,存放聚集對象
        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); }
        }
    }
}
           

因為疊代器是非常普遍的應用,是以各種進階語言都對它進行了封裝:Foreach in、IEnumerable接口

thanks for your time