疊代器模式
基于IEnumerable的實作
使用場景
疊代器模式的優缺點
疊代器模式用于順序通路集合對象的元素,而不需要知道集合對象的底層表示。Java和.Net等語言已經将疊代器作為其内部文法元素,比如在C#中,集合對象隻需要實作IEnumberable接口,然後就可以用foreach來周遊了。
疊代器模式提示我們要從使用者的角度考慮如何設計接口,如何對外提供通路内部對象的方式。即便我們組織的對象系統内部結構很複雜,但對于客戶程式而言最簡單的方式莫過于通過for /foreach循環依次周遊,至于周遊過程中的次序、分類篩選等則由目标類型自己封裝。
GOF對疊代器模式描述為:
Provide a way to access the elements of an aggregate objectsequentially without exposing its underlying representation.
— Design Patterns : Elements of Reusable Object-Oriented Software
UML類圖:

代碼實作
調用者代碼:
以上便是經典的疊代器模式的實作,這種模式給聚合對象增加了一個建立其疊代器對象的方法,疊代器的抽象定義和具體疊代器類型都作為一個額外的對象存在。
實際上C#已内置了對疊代器模式的支援,隻需要實作IEnumerable接口即可,不再需要從0開始,少了很多代碼量:
使用foreach周遊IEnumerable接口
對象内部結構比較複雜,為了讓調用者可以輕松地通路,同時不需要暴露其内部結構;
需要為聚合對象提供多種周遊方式;
為周遊不同的聚合結構提供一個統一的接口;
優點
疊代器支援以不同的方式周遊一個聚合對象,而且在同一個聚合上可以添加多個具有不同周遊方式的疊代器;
疊代器簡化了聚合類的周遊;
疊代器模式可以友善地增加新的聚合類和疊代器類,無須修改原有代碼。
缺點
疊代器模式通過将存儲資料和周遊資料的職責分離,為封裝集合地複雜性、隔離變化提供了極大的周遊,但這種方式也有其固有的缺點:每次
增加新的聚合類都需要對應增加新的疊代器類,類的個數成對增加,這在一定程度上增加了系統的複雜性。