设计模式-迭代器模式

定义

迭代器模式提供了一种方法,顺序访问集合对象中的元素,而又不暴露该对象的内部实现。
将集合中遍历元素的操作抽象出来,这样符合面向对象设计原则中的单一职责原则,我们要尽可能的分离这些职责,用不同的类去承担不同的责任,避免一个类中承担太多的责任。迭代器模式就是用迭代器类来承担遍历集合元素的责任。

自己实现一个迭代器:

    public interface IMyEnumerable<T>
    {
        IMyEnumerator<T> GetEnumerator();
    }
    public interface IMyEnumerator<T>
    {
        T Current { get; }
        bool MoveNext();
    }
    public class MyEnumerator<T> : IMyEnumerator<T>
    {
        private T[] _items = null;
        private int _index = -1;
        public MyEnumerator(T[] items)
        {
            this._items = items;
        }
        public T Current
        {
            get
            {
                return this._items[this._index];
            }
        }

        public bool MoveNext()
        {
            if (++this._index <= this._items.Length-1)
            {
                return true;
            }
            return false;
        }
    }

MyList:

public class MyList<T> : IMyEnumerable<T>
    {
        private T[] _items = null;
        public MyList(T[] items)
        {
            this._items = items;
        }
        public IMyEnumerator<T> GetEnumerator()
        {
            return new MyEnumerator<T>(this._items);
        }
    }

客户端:

static void Main(string[] args)
        {
            MyList<int> myList = new MyList<int>(new int[] { 1, 2, 3, 4, 5, 6 });
            foreach (var item in myList)
            {
                Console.WriteLine(item);
            }
            Console.ReadKey();
        }

Demo2:

public class OrderCollection : IEnumerable<Order> 
   { 
       List<Order> orderList; 
       public OrderCollection() 
       { 
           orderList = new List<Order>() { 
               new Order(){ OrderCode=Guid.NewGuid(),OrderName="订单1", OrderTime=DateTime.Now}, 
               new Order(){ OrderCode=Guid.NewGuid(),OrderName="订单2", OrderTime=DateTime.Now}, 
               new Order(){ OrderCode=Guid.NewGuid(),OrderName="订单3", OrderTime=DateTime.Now} 
           }; 
       } 

       public IEnumerator<Order> GetEnumerator() 
       { 
           foreach (var order in orderList) 
           { 
               yield return order; 
           } 
       } 
       System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() 
       { 
           foreach (var order in orderList) 
           { 
               yield return order; 
           } 
       } 
   }
posted @ 2020-07-25 11:31  .Neterr  阅读(97)  评论(0编辑  收藏  举报