天天看點

設計模式------Iterator疊代模式

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疊代模式

應用我們的上面介紹的例子,我們需要定義以下幾個接口與類:

對容器的周遊方法例:

Iterator模式的優點

1,實作功能分離,簡化容器接口。讓容器隻實作本身的基本功能,把疊代功能委讓給外部類實作,符合類的設計原則。

2,隐藏容器的實作細節。

3,為容器或其子容器提供了一個統一接口,一方面友善調用;另一方面使得調用者不必關注疊代器的實作細節。

4,可以為容器或其子容器實作不同的疊代方法或多個疊代方法。

繼續閱讀