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