行為型模式(四) 迭代器模式

2021-10-08 21:21:28 字數 3563 閱讀 7193

迭代器(iterator)模式:提供乙個物件來順序訪問聚合物件中的一系列資料,而不暴露聚合物件的內部表示。

迭代器模式是一種物件行為型模式,優點:

1、訪問乙個聚合物件的內容而無須暴露它的內部表示。

2、遍歷任務交由迭代器完成,這簡化了聚合類。

3、它支援以不同方式遍歷乙個聚合,甚至可以自定義迭代器的子類以支援新的遍歷。

4、增加新的聚合類和迭代器類都很方便,無須修改原有**。

5、封裝性良好,為遍歷不同的聚合結構提供乙個統一的介面。

缺點:增加了類的個數,這在一定程度上增加了系統的複雜性。

迭代器模式是通過將聚合物件的遍歷行為分離出來,抽象成迭代器類來實現的,其目的是在不暴露聚合物件的內部結構的情況下,讓外部**透明地訪問聚合的內部資料。

迭代器模式主要包含以下角色:

1、抽象聚合(aggregate)角色:定義儲存、新增、刪除聚合物件以及建立迭代器物件的介面。

2、具體聚合(concreteaggregate)角色:實現抽象聚合類,返回乙個具體迭代器的例項。

3、抽象迭代器(iterator)角色:定義訪問和遍歷聚合元素的介面,通常包含 hasnext()、first()、next() 等方法。

4、具體迭代器(concretelterator)角色:實現抽象迭代器介面中所定義的方法,完成對聚合物件的遍歷,記錄遍歷的當前位置。

圖1 迭代器模式的結構圖

1、當需要為聚合物件提供多種遍歷方式時。

2、當需要為遍歷不同的聚合結構提供乙個統一的介面時。

3、當訪問乙個聚合物件的內容而無須暴露其內部細節的表示時。

由於聚合與迭代器的關係非常密切,所以大多數語言在實現聚合類時都提供了迭代器類,因此大數情況下使用語言中已有的聚合類的迭代器就已經夠了。

迭代器模式常常與組合模式結合起來使用,在對組合模式中的容器構件進行訪問時,經常將迭代器潛藏在組合模式的容器構成類中。

當然,也可以構造乙個外部迭代器來對容器構件進行訪問,其結構圖如圖2所示。

圖2 組合迭代器模式的結構圖

圖3 **結構圖

抽象迭代器角色:

package

com.example.designpattern.iterator

;/**

* @author administrator

* @date 2020/8/5

* 抽象迭代器角色

*/inte***ce

iterator

抽象容器角色:

package

com.example.designpattern.iterator

;/**

* @author administrator

* @date 2020/8/5

* 抽象容器角色

*/inte***ce

collection

具體容器角色,內含具體迭代器角色:

package

com.example.designpattern.iterator

;/**

* @author administrator

* @date 2020/8/5

* 具體容器角色

* 內部實現了具體迭代器角色(見下文注釋)

* * 模擬陣列集合

* 使用陣列來模擬集合的概念

*/class

arraylist

implements

collection

objs[index]

= obj;

index++;}

/** * 獲取集合元素的個數

*/@override

public

intsize()

@override

public

iterator

iterator()

else

}@override

public

object

next()

};}}

空實現示例:

package

com.example.designpattern.iterator

;/**

* @author administrator

* @date 2020/8/5

* 具體容器角色

* 內部的iterator實現就是具體迭代器角色(參考arraylist)

* * 模擬jdk中的類linkedlist,暫定空實現

*/class

linkedlist

implements

collection

@override

public

intsize()

@override

public

iterator

iterator()

}

呼叫:

package

com.example.designpattern.iterator

;/**

* @author administrator

* @date 2020/8/5

*/class

client

system

.out.

println

("集合元素的個數="

+ list.

size()

);/* 問題:自定義的arraylist、linkedlist等的迭代**不統一。

辦法:將不同演算法的迭代,在客戶端使用時統一為iterator型別。

*/iterator it = list.

iterator()

;while

(it.

hasnext())}}

測試結果:

圖4 測試結果

四 迭代器模式Iterator(行為型模式)

迭代器模式為順序訪問集合物件的元素提供一種方式,且不暴露其底層表示法。就資料結構而言,它們把複雜的瀏覽途徑部分委託給iterator類別。讓其資料結構能與各式各樣的iterator類別搭配,而且分和自如。因而iterator類別包容了資料結構 如arraylist和database 的多變性,非常有...

行為型模式 迭代器模式

迭代器模式 iterator 用於依序遍歷訪問集合物件的每一元素,但不暴露集合物件的內部結構,只允許讓外部來訪問集合內部的資料,在實作上通常會抽象出乙個迭代器類並含有 hasnext 及next 之介面定義 再由其繼承具體子類負責集合物件的遍歷行為之功能。示例 from abc import abc...

設計模式 行為型模式 迭代器模式

抽象聚合類 abstract class abstractobjectlist public void addobject object obj public void removeobject object obj public list getobjects 宣告建立迭代器物件的抽象工廠方法 p...