一、簡介(Brief Introduction)
提供一種方法順序通路一個聚合對象中各個元素,而又不需暴露該對象的内部表示
例子1:電視遙控器的頻道周遊
二、模式分析(Analysis)
Iterator(疊代器):疊代器定義通路和周遊元素的接口
ConcreteIterator(具體疊代器):具體疊代器實作疊代器接口,對該聚合周遊時跟蹤目前位置,跟蹤聚合中的目前對象,并能夠計算出待周遊的後繼對象
Aggregate(聚合):聚合定義建立相應疊代器對象的接口
ConcreteAggregate(具體聚合):具體聚合實作建立相應疊代器的接口,該操作傳回ConcreteIterator的一個适當的執行個體
三、案例分析(Example)
namespace 疊代器
{
1、用戶端
class Program
{
static void Main(string[] args)
{
ConcrteAggregate a = new ConcrteAggregate();
a[0] = "大鳥";
a[1] = "小菜";
a[2] = "行李";
a[3] = "老外";
a[4] = "公交内部員工";
a[5] = "小偷";
Iterator i = new ConcreteIterator(a);
object item = i.First();
while (!i.IsDone())
{
Console.WriteLine("{0} 請買票!", i.CurrentItem());
i.Next();
}
Console.Read();
}
}
2、Itrator疊代器抽象類
abstract class Iterator
{
public abstract object First();
public abstract object Next();
public abstract bool IsDone();
public abstract object CurrentItem();
}
3、Aggregate聚集抽象類
abstract class Aggregate
{
public abstract Iterator CreateIterator();
}
//concreteIterator具體疊代器,繼承Iterator
class ConcreteIterator : Iterator
{
private ConcrteAggregate aggregate;
private int current = 0;
public ConcreteIterator(ConcrteAggregate 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];
}
}
4、ConcreteAggregate具體聚集類,
class ConcrteAggregate : 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 );}
}
}
}
四、解決的問題(What To Solve)
疊代器模式可用來:
• 通路一個聚合對象的内容而無需暴露它的内部表示。
• 需要為聚合對象提供多種周遊方式。
• 為周遊不同的聚合結構提供一個統一的接口 (即, 支援多态疊代)
疊代器模式是與集合共生共死的,一般來說,我們隻要實作一個集合,就需要同時提供這個集合的疊代器。假如我們要實作一個這樣的新的容器,當然也需要引入疊代器模式,給我們的容器實作一個疊代器。
但是,由于容器與疊代器的關系太密切了,是以大多數語言在實作容器的時候都給提供了疊代器,并且這些語言提供的容器和疊代器在絕大多數情況下就可以滿足我 們的需要,是以現在需要我們自己去實踐疊代器模式的場景還是比較少見的,我們隻需要使用語言中已有的容器和疊代器就可以了。
五、優缺點(Advantage and Disadvantage)
優點:
1 )它支援以不同的方式周遊一個聚合對象 : 複雜的聚合可用多種方式進行周遊。疊代器模式使得改變周遊算法變得很容易 : 僅需用一個不同的疊代器的執行個體代替原先的執行個體即可。你也可以自己定義疊代器的子類以支援新的周遊。
2) 疊代器簡化了聚合的接口有了疊代器的周遊接口,聚合本身就不再需要類似的周遊接口了。這樣就簡化了聚合的接口。
3) 在同一個聚合上可以有多個周遊每個疊代器保持它自己的周遊狀态。是以你可以同時進行多個周遊。
4)在疊代器模式中,增加新的聚合類和疊代器類都很友善,無須修改原有代碼,滿足“開閉原則”的要求。
5)封裝性良好,使用者隻需要得到疊代器就可以周遊,而對于周遊算法則不用去關心。
缺點
由于疊代器模式将存儲資料和周遊資料的職責分離,增加新的聚合類需要對應增加新的疊代器類,類的個數成對增加,這在一定程度上增加了系統的複雜性。對于比較簡單的周遊(像數組或者有序清單),使用疊代器方式周遊較為繁瑣,大家可能都有感覺,像ArrayList,我們甯可願意使用for循環和get方法來周遊集合。
六、擴充(Extend)
1)聚合是一個管理群組織資料對象的資料結構。
2)聚合對象主要擁有兩個職責:一是存儲内部資料;二是周遊内部資料。
3)存儲資料是聚合對象最基本的職責。
4)将周遊聚合對象中資料的行為提取出來,封裝到一個疊代器中,通過專門的疊代器來周遊聚合對象的内部資料,這就是疊代器模式的本質。疊代器模式是“單一職責原則”的完美展現。
七、聯系(Link)
Composite :疊代器常被應用到象複合這樣的遞歸結構上。
FactoryMethod:多态疊代器靠Factory Method來例化适當的疊代器子類。
Memento:常與疊代器模式一起使用。疊代器可使用一個 Memento來捕獲一個疊代的狀态。疊代器在其内部存儲Memento。
八、總結(Summary)
疊代器結合了封裝和多态的面向對象程式設計原理。使用疊代器,你可以對集合中的對象進行操作,而無需專門了解集合如何顯現或者集合包含什麼(對象的種 類)。疊代器提供了不同固定疊代實作的統一接口,它完全包含了如何操縱特定集合的詳細資訊,包括顯示哪些項(過濾)及其顯示順序(排序)。