行为型模式:Iterator 迭代器模式

                                                                行为型模式:Iterator 迭代器模式

1、集合内部结构与外部访问
  1)集合的功能是用来保存其它对象的。
  2)减少依赖,适应更多的变化。
 
2、动机(Motivation)
  1)在软件构建过程中,集合对象内部结构常常变化各异。但对于这些集合对象,我们希望在不暴露其内部结构的同时,可以让外部客户代码透明地访问其中包含的元素;同时这种“透明遍历”也为“同一种算法在多种集合对象上进行操作”提供了可能。
  2)使用面向对象技术将这种遍历机制抽象为“迭代器对象”为“应对变化中的集合对象”提供了一种优邪雅的方式。
 
3、意图(Intent)
  提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示。
                                                                                                    ——《设计模式》GoF
 
4、实例:
  1)迭代器的两个抽象接口:
public interface IEnumerable
{
  IEnumerator GetEnumerator();
}
public interface IEnumerator
{
  Object Current{ get;} //返回当前集合中的元素
  bool MoveNext();  //遍历集合     
  void Reset();     //方法恢复初始化指向的位置
}

  2)实现IEnumerable接口和IEnumerator接口
public class MyCollection : IEnumerable
{
  int[] items;
  public MyCollection(int[] iNums)
  {
    items = new int[iNums.Length];
    iNums.CopyTo(items, 0);
  }
 
  public IEnumerator GetEnumerator()
  {
    //1.1做法
    return new MyEnumerator(this);
    /*
    //2.0做法,不需要写下面的私有类
    for (int i = 0; i < items.Length; i++)
    {
      //yieid return语句是一个能动态生成迭代类型的语句
      yieid return items[i];
    }
    */
  }
 
  private class MyEnumerator : IEnumerator
  {
    int nIndex;
    MyCollection collection;
 
    public MyEnumerator(MyCollection collection)
    {
      this.collection = collection;
      nIndex = -1;
    }
 
    public bool MoveNext()
    {
      nIndex++;
      return (nIndex < collection.items.Length);
    }
 
    public object Current
    {
      get
      {
        return (collection.items[nIndex]);
      }
    }
 
    public void Reset()
    {
      nIndex = -1;
    }
  }
}

public static class Main()
{
  int[] iNums = new int[5]{12, 44, 33, 2, 50};
  MyCollection col = new MyCollection(iNums);
 
  foreach (int i in col)
  {
    Console.WriteLine(i);
  }
 
  //完全抽象(不依赖)于容器(集合)结构的访问操作
  IEnumerator ietor = col.GetEnumerator();
  while(ietor.MoveNext())
  {
    int i = (int)ietor.Current;
    Console.WriteLine(i);
  }
 
  //下面的while循环部份在.NET中被抽象为上面的foreach部分了
}


5、Iterator模式的几个要点
  1)迭代抽象:访问一个聚合对象的内容而无需暴露它的内部表示。
  2)迭代多态:为遍历不同的集合结构提供一个统一的接口,从而支持同样的算法在不同的集合结构上进行操作。
  3)迭代器的健壮性考虑:遍历的同时更改迭代器所在的集合结构,会导致问题。

你可能感兴趣的:(行为型模式:Iterator 迭代器模式)