【设计模式-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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值