C#設計模式之迭代器模式

提高班14期郭倩_Ulrica發表於2018-06-05

前言

介紹比較少,直接看程式碼吧。也是一個很容易懂的模式~

迭代器模式

英文: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();
        }
    }

圖示效果:

迭代器模式

後記

敲完了這個就想到了介面卡模式。感覺這兩個模式都是很好用也挺簡單的。設計模式很重要也是一個很有實踐力的學習模組,以後還會再深入學習的~

相關文章