.NET類庫中發現設計模式:迭代器模式

來源:互聯網
上載者:User

迭代模式:

    提供一種方法順序訪問一個彙總對象中各個元素,而又不需暴露該對象的內部表示。

 

.NET中應用:

 

 

   

   /// <summary>
    /// 抽象聚集
    /// </summary>
    public interface IList
    {
        IIterator GetIterator();
    }

    /// <summary>
    /// 抽象迭代器
    /// </summary>
    public interface IIterator
    {
        bool MoveNext();

        Object CurrentItem();

        void First();

        void Next();
    }

    /// <summary>
    /// 具體聚集
    /// </summary>
    public class ConcreteList : IList
    {
        int[] list;
        public ConcreteList()
        {
            list = new int[] { 1, 2, 3, 4, 5 };
        }

        public IIterator GetIterator()
        {
            return new ConcreteIterator(this);
        }

        public int Length
        {
            get { return list.Length; }
        }

        public int GetElement(int index)
        {
            return list[index];
        }
    }

    /// <summary>
    /// 具體迭代器
    /// </summary>
    public class ConcreteIterator : IIterator
    {
        private ConcreteList list;
        private int index;
        public ConcreteIterator(ConcreteList list)
        {
            this.list = list;
            index = 0;
        }

        public bool MoveNext()
        {
            if (index < list.Length)
                return true;
            else
                return false;
        }

        public Object CurrentItem()
        {
            return list.GetElement(index);
        }
        public void First()
        {
            index = 0;
        }
        public void Next()
        {
            if (index < list.Length)
            {
                index++;
            }
        }
    }

    /// <summary>
    /// 用戶端程式
    /// </summary>
    public class Program
    {
        static void Main(string[] args)
        {
            IIterator iterator;

            IList list = new ConcreteList();

            iterator = list.GetIterator();

            while (iterator.MoveNext())
            {
                int i = (int)iterator.CurrentItem();
                Console.WriteLine(i.ToString());

                iterator.Next();
            }

            Console.Read();
        }
    }

 

        首先有一個抽象的聚集IList,所謂的聚集就是就是資料的集合,可以迴圈去訪問它。它只有一個方法GetIterator()讓子類去實現,用來獲得一個迭代器對象。抽象的迭代器IIterator,它是用來訪問聚集的類,封裝了一些方法,用來把聚集中的資料按順序讀取出來。通常會有MoveNext()、CurrentItem()、Fisrt()、Next()等幾個方法讓子類去實現。具體的聚集ConcreteList ,它實現了抽象聚集中的唯一的方法,同時在裡面儲存了一組資料,這裡我們加上Length屬性和GetElement()方法是為了便於訪問聚集中的資料。具體迭代器ConcreteIterator
,實現了抽象迭代器中的四個方法,在它的建構函式中需要接受一個具體聚集類型的參數,在這裡面我們可以根據實際的情況去編寫不同的迭代方式。

       IEnumerable和IEnumerator明顯是在.NET Framework封裝好的迭代器模式,實現了IEnumerator的迭代類從實現了IEnumerable的集合類中分離開來,這個類負責來處理枚舉的狀態(包括怎麼表達當前數組中的元素和如何迭代集合中的元素),並把枚舉的演算法包含其中。這種方法能讓你同時有幾個用不同的方法枚舉集合的迭代器,而不需要給集合添加任何的複雜性!

 public class Persons : IEnumerable
    {
        string[] m_Names;
        public Persons(params string[] Names)
        {
            m_Names = new string[Names.Length];

            Names.CopyTo(m_Names, 0);
        }
        public IEnumerator GetEnumerator()
        {
            foreach (string s in m_Names)
            {
                yield return s;
            }
        }
    }

    public class Program
    {
        static void Main(string[] args)
        {
            Persons arrPersons = new Persons("Michel", "Christine", "Mathieu", "Julien");
            foreach (string s in arrPersons)
            {
                Console.WriteLine(s);
            }
            Console.ReadLine();
        }
    }

 參考:http://www.cnblogs.com/Terrylee/archive/2006/09/16/Iterator_Pattern.html

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.