【設計模式-10】迭代器模式

Iterator(迭代器) 負責定義訪問和遍歷元素的接口
ConcreteIteraror(具體迭代器) 實現迭代器接口,並需要記錄遍歷中的當前位置
Aggregate(聚合角色) 定義獲得迭代器角色的接口
ConcreteAggregate(具體聚合角色) 具體聚合角色實現聚合角色接口

定義:迭代器模式提供了一種方法順序訪問一個聚合對象(理解爲集合對象)中各個元素,而又無需暴露該對象的內部表示,這樣既可以做到不暴露集合的內部結構,又可讓外部代碼透明地訪問集合內部的數據。

白箱聚集與外稟迭代器:具體迭代器持有具體集合類的引用。通過抽象迭代器方法,繼而調用到具體迭代器的方法,實現對具體集合類的迭代訪問。

 //定義一個抽象聚合類
    public abstract class Aggergate
    {
        //創建一個迭代器
        public virtual Iterator CreateIterator()
        {
            return null;
        }
    }

    //定義一個具體聚合類
    public class ConcreteAggregate:Aggergate
    {
        private object[] m_objsAry = { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" };

        public int Size()
        {
            return m_objsAry.Length;
        }

        public object GetElement(int _index)
        {
            if(_index < 0 || _index > m_objsAry.Length)
            {
                return null;
            }
            return m_objsAry[_index];
        }

        public override Iterator CreateIterator()
        {
            return new ConcreteIterator(this);
        }
    }

    //定義一個迭代接口
     public interface Iterator
     {
         void First();
         void Next();
         bool IsDone();
         object CurrentItem();
     } 

    //具體迭代器類
     public class ConcreteIterator:Iterator
     {
         public ConcreteAggregate m_aggretate;
         private int m_index = 0;
         private int m_size = 0;

         public ConcreteIterator(ConcreteAggregate _aggregate)
         {
             m_aggretate = _aggregate;
             m_size = m_aggretate.Size();
             m_index = 0;
         }

         public void First()
         {
             m_index = 0;
         }

         public void Next()
         {
             if(m_index < m_size)
             {
                 m_index++;
             }
         }

         public bool IsDone()
         {
             return m_index >= m_size;
         }

         public object CurrentItem()
         {
             return m_aggretate.GetElement(m_index);
         }
     }

    void Start()
     {
        Iterator tempIterator;
        Aggergate tempAggregate = new ConcreteAggregate();
        tempIterator = tempAggregate.CreateIterator();
        while(!tempIterator.IsDone())
        {
            Debug.Log(tempIterator.CurrentItem());
            tempIterator.Next();
        }
     }

黑箱聚集與內稟迭代器:黑箱聚集不向外界提供遍歷自己內部元素的接口,因此聚集的成員只能被聚集內部的方法訪問。由於內稟迭代器恰好也是聚集的成員,因此可以訪問聚集元素。

//定義一個抽象聚合類
    public abstract class Aggergate
    {
        //創建一個迭代器
        public virtual Iterator CreateIterator()
        {
            return null;
        }
    }

    //定義一個具體聚合類
    public class ConcreteAggregate:Aggergate
    {
        public static object[] m_objsAry = { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" };

        private class ConcreteIterator:Iterator
        {
            private int m_index = 0;
            private int m_size = 0;
            public void First()
            {
                m_index = 0;
            }

            public void Next()
            {
                if(m_index < m_objsAry.Length)
                {
                    m_index++;
                }
            }

            public bool IsDone()
            {
                return m_index == m_objsAry.Length;
            }

            public object CurrentItem()
            {
                return m_objsAry[m_index];
            }
        }

        public int Size()
        {
            return m_objsAry.Length;
        }

        public object GetElement(int _index)
        {
            if(_index < 0 || _index > m_objsAry.Length)
            {
                return null;
            }
            return m_objsAry[_index];
        }

        public override Iterator CreateIterator()
        {
            return new ConcreteIterator();
        }
    }

    //定義一個迭代接口
     public interface Iterator
     {
         void First();
         void Next();
         bool IsDone();
         object CurrentItem();
     } 


    void Start()
     {
        Iterator tempIterator;
        Aggergate tempAggregate = new ConcreteAggregate();
        tempIterator = tempAggregate.CreateIterator();
        while(!tempIterator.IsDone())
        {
            Debug.Log(tempIterator.CurrentItem());
            tempIterator.Next();
        }
     }

參考:

https://www.cnblogs.com/libingql/p/3638608.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章