Iterator模式也叫疊代模式,是由GoF提出的23種設計模式的一種。Iterator模式是行為模式之一,它把對容器中包含的内部對象的通路委讓給外部類,使用Iterator(周遊)按順序進行周遊通路的設計模式。
本文介紹設計模式中的疊代(Iterator)模式的概念,用法,以及實際應用中怎麼樣使用疊代模式進行開發。
Iterator模式的概念
Iterator模式指對容器中包含的内部對象的通路委讓給外部類,使用Iterator(周遊)按順序進行周遊通路的設計模式。
在 程式設計中,經常有這種情況,需要從大量得資料(對象)集合中一個個地取出資料加以處理。Iterator模式就是為了有效地處理按順序進行周遊通路的一 種設計模式,簡單地說,Iterator模式提供一種有效的方法,可以屏蔽聚集對象集合的容器類的實作細節,而能對容器内包含的對象元素按順序進行有效的 周遊通路。
是以,Iterator模式的應用場景可以歸納為滿足以下幾個條件:
- 通路容器中包含的内部對象
- 按順序通路
為什麼需要Iterator模式
在應用Iterator模式之前,首先應該明白Iterator模式用來解決什麼問題。或者說,如果不使用Iterator模式,會存在什麼問題。
我們舉例來說明Iterator模式到底好在哪。
比如有一個Book類,一個管理Book的容器類BookList:
我們需要按順序周遊通路BookList包含的Book對象。
怎麼實作順序周遊方法呢?
你可能會考慮以下這些周遊方法:
方法1,由容器自己實作順序周遊。直接在BookList裡添加順序周遊方法:
使用時,可能的使用方法是:
方法2,讓調用者自己實作周遊。直接暴露BookList資料細節給外部,比如:
可能的使用方法為:
以上方法1與方法2都可以實作對BookList所包含的Book對象進行周遊,這樣有問題呢?
确實使用上沒有任何問題。
但實作方法1中,
1,容器類BookList承擔了太多功能:一方面需要提供添加删除等BookList本身應有的功能;一方面還需要提供周遊通路功能。
2,往往容器在實作周遊的過程中,需要儲存周遊狀态,當跟元素的添加删除等功能夾雜在一起,很容易引起混亂和程式運作錯誤等。
在實作方法2中,
容器本身未實作任何周遊方法,把這個周遊的任務交給了調用者,這樣一來,暴露了容器本身的實作細節,如果一旦容器内部的資料接口發生變化,比如由于某種原 因,BookList的List bookList用Map bookList來實作,這樣,所有調用方的程式不得不随着BookList的修改而修改。
Iterator模式很好地解決了以上問題。
我們先從JDK中的Collection Framework對Iterator模式的實作方法來說明Iterator模式。
Java Collection Framework對疊代模式的經典實作
1、Iterable.java
2、疊代接口:Iterator接口,定義了周遊接口:
3,容器接口:Collection接口,定義了iterator()方法,把周遊委讓給Iterator的實作類。
4、容器接口Collection的實作類與疊代接口Iterator的實作類:
以上說明了Java Collection Framework裡的對Iterator模式的基本實作方法。
這也是Iterator模式一種經典的實作方案。
經典的Iterator模式實作方案
下面是一種比較經典的Iterator模式實作方案,該實作方案基于接口設計原則,設計了以下幾個接口或類:
疊代器接口Iterator:該接口必須定義實作疊代功能的最小定義方法集比如提供hasNext()和next()方法。
疊代器實作類:疊代器接口Iterator的實作類。可以根據具體情況加以實作。
容器接口:定義基本功能以及提供類似Iterator iterator()的方法。
容器實作類:容器接口的實作類。必須實作Iterator iterator()方法。
Iterator模式的類圖:
應用我們的上面介紹的例子,我們需要定義以下幾個接口與類:
對容器的周遊方法例:
Iterator模式的優點
1,實作功能分離,簡化容器接口。讓容器隻實作本身的基本功能,把疊代功能委讓給外部類實作,符合類的設計原則。
2,隐藏容器的實作細節。
3,為容器或其子容器提供了一個統一接口,一方面友善調用;另一方面使得調用者不必關注疊代器的實作細節。
4,可以為容器或其子容器實作不同的疊代方法或多個疊代方法。