デザインモード:反復モード(Iterator Pattern)反復モードIterator Pattern

21073 ワード

作者:TerryLee創建于:2006-09-16出典:http://www.cnblogs.com/Terrylee/archive/2006/09/16/Iterator_Pattern.html収録于:2013-02-28
構造図
  设计模式:迭代器模式(Iterator Pattern)
意図
オブジェクトの内部表現を露出することなく、集約オブジェクト内の各要素に順次アクセスする方法を提供します.
適用性
  • は、内部表現を露出することなく、集約されたオブジェクトのコンテンツにアクセスする.
  • は、集約されたオブジェクトの複数の遍歴をサポートします.
  • は、異なる集約構造を遍歴するための統一的なインタフェース(すなわち、マルチステート反復をサポートする)を提供する.
  • インプリメンテーションコード
    オブジェクト向けのソフトウェア設計では、集合オブジェクトによく遭遇します.このような集合オブジェクトの内部構造は様々な実現があるかもしれませんが、まとめると、集合内部のデータストレージ構造と、集合内部のデータを遍歴する2つの点に注目する必要があります.オブジェクト向け設計の原則の1つはクラスの単一の職責の原則であるため、私たちはできるだけこれらの職責を分解し、異なるクラスで異なる職責を負わなければならない.Iteratorモードは,集合オブジェクトの遍歴挙動を分離し,反復器クラスを抽象化して責任を負うことであり,集合の内部構造を露出させず,外部コードを集合内部のデータに透過的にアクセスさせることができる.次に、クラス構造図の簡単な概略例を見てみましょう.
    设计模式:迭代器模式(Iterator Pattern)


    View Code
     1 using System;
    
     2 class Program
    
     3 {
    
     4     static void Main(string[] args)
    
     5     {
    
     6         IIterator iterator;
    
     7         IList list = new ConcreteList();
    
     8         iterator = list.GetIterator();
    
     9         while (iterator.MoveNext())
    
    10         {
    
    11             int i = (int)iterator.CurrentItem();
    
    12             Console.WriteLine(i.ToString());
    
    13             iterator.Next();
    
    14         }
    
    15         Console.Read();
    
    16     }
    
    17 }
    
    18 public interface IList
    
    19 {
    
    20     IIterator GetIterator();
    
    21 }
    
    22 public interface IIterator
    
    23 {
    
    24     bool MoveNext();
    
    25     Object CurrentItem();
    
    26     void First();
    
    27     void Next();
    
    28 }
    
    29 public class ConcreteList : IList
    
    30 {
    
    31     int[] list;
    
    32     public ConcreteList()
    
    33     {
    
    34         list = new int[] { 1, 2, 3, 4, 5 };
    
    35     }
    
    36     public IIterator GetIterator()
    
    37     {
    
    38         return new ConcreteIterator(this);
    
    39     }
    
    40     public int Length
    
    41     {
    
    42         get { return list.Length; }
    
    43     }
    
    44     public int GetElement(int index)
    
    45     {
    
    46         return list[index];
    
    47     }
    
    48 }
    
    49 public class ConcreteIterator : IIterator
    
    50 {
    
    51     private ConcreteList list;
    
    52     private int index;
    
    53     public ConcreteIterator(ConcreteList list)
    
    54     {
    
    55         this.list = list;
    
    56         index = 0;
    
    57     }
    
    58     public bool MoveNext()
    
    59     {
    
    60         if (index < list.Length)
    
    61             return true;
    
    62         else
    
    63             return false;
    
    64     }
    
    65     public Object CurrentItem()
    
    66     {
    
    67         return list.GetElement(index);
    
    68     }
    
    69     public void First()
    
    70     {
    
    71         index = 0;
    
    72     }
    
    73     public void Next()
    
    74     {
    
    75         if (index < list.Length)
    
    76         {
    
    77             index++;
    
    78         }
    
    79     }
    
    80 }

     .NETのIteratorモード
    はい.NETではIteratorモードが実装され、集約インタフェースと反復インタフェースがすでに存在し、IEnumeratorが反復器の役割を果たすNETのIteratorモード


    View Code
     1 using System;
    
     2 class Client 
    
     3 {
    
     4     static void Main(string[] args)
    
     5     {
    
     6         Persons arrPersons = new Persons("Michel", "Christine", "Mathieu", "Julien");
    
     7         foreach (string s in arrPersons)
    
     8         {
    
     9             Console.WriteLine(s);
    
    10         }
    
    11         Console.ReadLine();
    
    12     } 
    
    13 }
    
    14 public interface IEumerator
    
    15 {
    
    16     object Current
    
    17     {
    
    18         get;
    
    19     }
    
    20     bool MoveNext();
    
    21     void Reset();
    
    22 }
    
    23 public interface IEnumerable
    
    24 {
    
    25     IEumerator GetEnumerator();
    
    26 }
    
    27 public class Persons : IEnumerable 
    
    28 { 
    
    29     public string[] m_Names; 
    
    30     public Persons(params string[] Names) 
    
    31     { 
    
    32         m_Names = new string[Names.Length]; 
    
    33         Names.CopyTo(m_Names,0); 
    
    34     } 
    
    35     
    
    36     public IEumerator GetEnumerator()
    
    37     {
    
    38         return new PersonsEnumerator(this);
    
    39     }
    
    40 }
    
    41 
    
    42 public class PersonsEnumerator : IEumerator
    
    43 {
    
    44     private int index = -1;
    
    45     private Persons P;
    
    46     public PersonsEnumerator(Persons P)
    
    47     {
    
    48         this.P = P;
    
    49     }
    
    50     public bool MoveNext()
    
    51     {
    
    52         index++;
    
    53         return index < P.m_Names.Length;
    
    54     }
    
    55     public void Reset()
    
    56     {
    
    57         index = -1;
    
    58     }
    
    59     public object Current
    
    60     {
    
    61         get
    
    62         {
    
    63             return P.m_Names[index];
    
    64         }
    
    65     }
    
    66 }

    効果と実現のポイント
    1.反復抽象:内部表現を露出することなく、集約オブジェクトのコンテンツにアクセスします.
    2.反復マルチステート:異なる集合構造を遍歴するための統一的なインタフェースを提供し、同じアルゴリズムが異なる集合構造上で動作することをサポートする.
    3.反復器の堅牢性の考慮:反復器が存在する集合構造を遍歴しながら変更すると、問題が発生します.