行爲型模式: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部分了
}this


5、Iterator模式的幾個要點
  1)迭代抽象:訪問一個聚合對象的內容而無需暴露它的內部表示。
  2)迭代多態:爲遍歷不一樣的集合結構提供一個統一的接口,從而支持一樣的算法在不一樣的集合結構上進行操做。
  3)迭代器的健壯性考慮:遍歷的同時更改迭代器所在的集合結構,會致使問題。設計

相關文章
相關標籤/搜索