天天看點

設計模式(17) 疊代器模式

疊代器模式

基于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類圖:

設計模式(17) 疊代器模式

代碼實作

調用者代碼:

以上便是經典的疊代器模式的實作,這種模式給聚合對象增加了一個建立其疊代器對象的方法,疊代器的抽象定義和具體疊代器類型都作為一個額外的對象存在。

實際上C#已内置了對疊代器模式的支援,隻需要實作IEnumerable接口即可,不再需要從0開始,少了很多代碼量:

使用foreach周遊IEnumerable接口

對象内部結構比較複雜,為了讓調用者可以輕松地通路,同時不需要暴露其内部結構;

需要為聚合對象提供多種周遊方式;

為周遊不同的聚合結構提供一個統一的接口;

優點

疊代器支援以不同的方式周遊一個聚合對象,而且在同一個聚合上可以添加多個具有不同周遊方式的疊代器;

疊代器簡化了聚合類的周遊;

疊代器模式可以友善地增加新的聚合類和疊代器類,無須修改原有代碼。

缺點

疊代器模式通過将存儲資料和周遊資料的職責分離,為封裝集合地複雜性、隔離變化提供了極大的周遊,但這種方式也有其固有的缺點:每次

增加新的聚合類都需要對應增加新的疊代器類,類的個數成對增加,這在一定程度上增加了系統的複雜性。

繼續閱讀