天天看點

C#設計模式(16)——疊代器模式(Iterator Pattern)一、引言二、疊代器模式的介紹三、.NET中疊代器模式的應用四、疊代器模式的适用場景五、疊代器模式的優缺點六、總結

  在上篇博文中分享了我對指令模式的了解,指令模式主要是把行為進行抽象成指令,使得請求者的行為和接受者的行為形成低耦合。在一章中,将介紹一下疊代器模式。下面廢話不多說了,直接進入本博文的主題。

  疊代器是針對集合對象而生的,對于集合對象而言,必然涉及到集合元素的添加删除操作,同時也肯定支援周遊集合元素的操作,我們此時可以把周遊操作也放在集合對象中,但這樣的話,集合對象就承擔太多的責任了,面向對象設計原則中有一條是單一職責原則,是以我們要盡可能地分離這些職責,用不同的類去承擔不同的職責。疊代器模式就是用疊代器類來承擔周遊集合元素的職責。

  疊代器模式提供了一種方法順序通路一個聚合對象(了解為集合對象)中各個元素,而又無需暴露該對象的内部表示,這樣既可以做到不暴露集合的内部結構,又可讓外部代碼透明地通路集合内部的資料。

  既然,疊代器模式承擔了周遊集合對象的職責,則該模式自然存在2個類,一個是聚合類,一個是疊代器類。在面向對象涉及原則中還有一條是針對接口程式設計,是以,在疊代器模式中,抽象了2個接口,一個是聚合接口,另一個是疊代器接口,這樣疊代器模式中就四個角色了,具體的類圖如下所示:

C#設計模式(16)——疊代器模式(Iterator Pattern)一、引言二、疊代器模式的介紹三、.NET中疊代器模式的應用四、疊代器模式的适用場景五、疊代器模式的優缺點六、總結

  從上圖可以看出,疊代器模式由以下角色組成:

疊代器角色(Iterator):疊代器角色負責定義通路和周遊元素的接口

具體疊代器角色(Concrete Iteraror):具體疊代器角色實作了疊代器接口,并需要記錄周遊中的目前位置。

聚合角色(Aggregate):聚合角色負責定義獲得疊代器角色的接口

具體聚合角色(Concrete Aggregate):具體聚合角色實作聚合角色接口。

  介紹完疊代器模式之後,下面就具體看看疊代器模式的實作,具體實作代碼如下:

自然,上面代碼的運作結果也是對集合每個元素的輸出,具體運作結果如下圖所示:

C#設計模式(16)——疊代器模式(Iterator Pattern)一、引言二、疊代器模式的介紹三、.NET中疊代器模式的應用四、疊代器模式的适用場景五、疊代器模式的優缺點六、總結

  在.NET下,疊代器模式中的聚集接口和疊代器接口都已經存在了,其中IEnumerator接口扮演的就是疊代器角色,IEnumberable接口則扮演的就是抽象聚集的角色,隻有一個GetEnumerator()方法,關于這兩個接口的定義可以自行參考MSDN。在.NET 1.0中,.NET 類庫中很多集合都已經實作了疊代器模式,大家可以用反編譯工具Reflector來檢視下mscorlib程式集下的System.Collections命名空間下的類,這裡給出ArrayList的定義代碼,具體實作代碼可以自行用反編譯工具檢視,具體代碼如下所示:

  在下面的情況下可以考慮使用疊代器模式:

系統需要通路一個聚合對象的内容而無需暴露它的内部表示。

系統需要支援對聚合對象的多種周遊。

系統需要為不同的聚合結構提供一個統一的接口。

  由于疊代器承擔了周遊集合的職責,進而有以下的優點:

疊代器模式使得通路一個聚合對象的内容而無需暴露它的内部表示,即疊代抽象。

疊代器模式為周遊不同的集合結構提供了一個統一的接口,進而支援同樣的算法在不同的集合結構上進行操作

  疊代器模式存在的缺陷:

疊代器模式在周遊的同時更改疊代器所在的集合結構會導緻出現異常。是以使用foreach語句隻能在對集合進行周遊,不能在周遊的同時更改集合中的元素。

  到這裡,本博文的内容就介紹結束了,疊代器模式就是抽象一個疊代器類來分離了集合對象的周遊行為,這樣既可以做到不暴露集合的内部結構,又可讓外部代碼透明地通路集合内部的資料。在一篇博文中将為大家介紹觀察者模式。

繼續閱讀