イテレータモード(イテレータ)の定義:オブジェクトの内部表現を公開せずに、集約オブジェクトの各要素に順次アクセスするメソッドを提供します。
このパターンは、C#のforeach inなどの言語で記述されていますが、イテレータパターンの基本構造は理解できます。
利点:
- 内部表現を公開せずに、集約オブジェクトのコンテンツにアクセスします。
- トラバーサルのタスクはイテレーターによって完了されます。これにより、集約クラスが単純化されます。
- さまざまな方法で集計をトラバースすることをサポートし、イテレーターのサブクラスでさえ、新しいトラバースをサポートするようにカスタマイズできます。
- 元のコードを変更せずに、新しいアグリゲーションクラスとイテレータクラスを追加すると非常に便利です。
- さまざまな集約構造をトラバースするための統一されたインターフェイスを提供する、優れたカプセル化。
構造:
- 抽象集約(集約)ロール:集約オブジェクトを格納、追加、削除し、イテレーターオブジェクトを作成するためのインターフェースを定義します。
- Concrete Aggregate(ConcreteAggregate)ロール:抽象集約クラスを実装し、具象イテレーターのインスタンスを返します。
- 抽象イテレータの役割:通常、hasNext()、first()、next()などのメソッドを含む、集約要素にアクセスしてトラバースするためのインターフェイスを定義します。
- 具体的なイテレーター(Concretelterator)の役割:抽象イテレーターインターフェイスで定義されたメソッドを実装し、集約オブジェクトのトラバーサルを完了し、トラバーサルの現在の位置を記録します。
抽象集約クラスと具象集約クラス:
abstract class Aggregate
{
public abstract Iterator CreateIterator();//创建迭代器
}
class ConcreteAggregate : Aggregate
{
private IList<object> items = new List<object>();
public override Iterator CreateIterator()//具体迭代器实例化
{
return new ConcreteIterator(this);
}
public int Count//返回聚集总个数
{
get {
return items.Count; }
}
public object this[int index]//声明一个索引器
{
get {
return items[index]; }
set {
items.Insert(index, value); }
}
}
抽象イテレータ:
abstract class Iterator
{
public abstract object First();//得到开始对象
public abstract object Next();//得到下一个对象
public abstract bool IsDone();//判断是否到结尾
public abstract object CurrentItem();//当前对象
}
特定のイテレータ:
class ConcreteIterator : Iterator
{
private ConcreteAggregate aggregate;//定义一个具体聚集对象
private int current = 0;
//初始化时将具体的聚集对象传入
public ConcreteIterator(ConcreteAggregate aggregate)
{
this.aggregate = aggregate;
}
public override object First()//得到聚集的第一个对象
{
return aggregate[0];
}
public override object Next()//得到聚集的下一个对象
{
object ret = null;
current++;
if (current <aggregate.Count)
{
ret = aggregate[current];
}
return ret;
}
public override bool IsDone()//判断当前是否遍历到结尾,到结尾返回true
{
return current >= aggregate.Count ? true : false;
}
public override object CurrentItem()//返回当前的聚集对象
{
return aggregate[current];
}
}
クライアント:
static void Main(string[] args)
{
ConcreteAggregate a = new ConcreteAggregate();//公交车,即聚集对象
a[0] = "夏洛";
a[1] = "秋雅";
a[2] = "马冬梅";
Iterator i = new ConcreteIterator(a);//售票员出场,先看好了上车的是哪些人,即声明了迭代器对象
object item = i.First();
while (!i.IsDone ()) //从第一个乘客开始
{
Console.WriteLine("{0}请买车票!",i.CurrentItem ());//通知买票
i.Next();//下一个乘客
}
Console.Read();
}