疊代器模式:
提供一種順序通路聚合對象中各個元素的方法,同時又不暴露該對象的内部表示(結構),又可以讓外邊代碼通路集合内部的資料(如下面例子中的“提示某人買票”),疊代器模式 分離了 集合對象的周遊行為 。
為周遊 不同的聚集結構 提供 如:開始、下一個、是否結束、目前哪一項 等 (統一的)接口
适用場景:
通路聚集對象,不管對象是什麼 都 需要周遊的時候
需要對聚集有多種方式周遊時(售票員查票:從頭到尾、從尾到頭)
結構圖:
代碼:
namespace 疊代器模式
{
class Program
{
static void Main(string[] args)
{
ConcreteAggregate a = new ConcreteAggregate();
a[0] = "Cindy";
a[1] = "DIDDy";
a[2] = "Sendy";
a[3] = "Filed";
a[4] = "Oilded";
a[5] = "Hilded";
Iterator i = new ConcreteIterator(a);//聲明疊代器
object item=i.First ();
while (! i.IsDone ())
{
Console.WriteLine("\n{0}請買票",i.CurrentItem ());
i.Next ();
}
Console .Read ();
}
}
abstract class Iterator//定義抽象方法,統一接口
{
public abstract object First();
public abstract object Next();
public abstract bool IsDone();
public abstract Object CurrentItem();
}
abstract class Aggregate//建立疊代器
{
public abstract Iterator CreateIterator();
}
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()
{
return current >= aggregate.Count ? true : false;
}
public override object CurrentItem()
{
return aggregate[current];//傳回目前聚集對象
}
}
class ConcreteAggregate :Aggregate
{
//聲明一個IList泛型變量,存放聚集對象
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); }
}
}
}
因為疊代器是非常普遍的應用,是以各種進階語言都對它進行了封裝:Foreach in、IEnumerable接口
thanks for your time