1.1概述 提供一種方法順序訪問一個聚合對象中的各個元素,而又不需要暴露對象的內部表示。這就是迭代器模式的定義。 合理組織數據的結構以及相關操作是程式設計的一個重要方面,比如在程式設計中經常會使用諸如鏈表、散列表等數據結構。鏈表和散列表等數據結構都是可以存放若幹個對象的集合,其區別是按照不同的方式進 ...
1.1概述
提供一種方法順序訪問一個聚合對象中的各個元素,而又不需要暴露對象的內部表示。這就是迭代器模式的定義。
合理組織數據的結構以及相關操作是程式設計的一個重要方面,比如在程式設計中經常會使用諸如鏈表、散列表等數據結構。鏈表和散列表等數據結構都是可以存放若幹個對象的集合,其區別是按照不同的方式進行存儲對象。我們希望無論何種集合,應當允許程式以一種統一的方式遍歷集合中的對象,而不需要知道這些對象在集合中是如何表達及存儲的。
例如,一棟樓中居住著張三、李四、王五三個人,分別被安排在不同的房間,張三知道李四的房間,李四知道王五的房間。假如有一個警察,他並不知道他們三個是如何居住的,只想找到他們,那麼警察可以用一個next()方法找人,該方法的特點是在找到一個人的同時立刻讓這個人說出他知道的下一個人的房間,然後警察再調用next()方法找到下一個人。如果警察調用next()方法首先找到張三,就可以依次找到李四和王五,具體如圖一所示:
圖一:警察找人
迭代器模式是遍歷集合的成熟模式,迭代器模式的關鍵是將遍歷集合的任務交給一個稱作迭代器的對象。比如,前面所述的樓就是一個集合,其中的人就是集合中的對象,而警察就是一個迭代器。
1.2模式的結構
迭代器模式的結構中包括四種角色:
(1)集合(Aggregate):一個介面,規定了具體集合需實現的操作。
(2)具體集合(ConcreteAggregate):具體集合是實現集合介面的類的實例,具體集合按照一定的結構存儲對象。具體集合應當有一個方法,該方法返回一個針對該集合的具體迭代器。
(3)迭代器(Iterator):一個介面,規定了遍歷集合的方法,比如next()方法。
(4)具體迭代器(ConcreteIterator):實現迭代器介面的類的實例,具體迭代器在實現迭代器介面所規定的遍歷集合的方法時,比如next()方法,要保證next()方法的首次調用即按照集合的數據結構找到該集合中的一個對象,而且每當找到集合中的一個對象,立刻根據該集合的存儲結構得到待遍歷的後繼對象的引用,並保證依次調用next()方法可以遍歷集合。
迭代器模式結構的類圖如下圖二所示:
圖二:迭代器模式類圖
1.3迭代器模式的優點
(1)用戶使用迭代器模式訪問集合中的對象,而不需要知道這些對象在集合中是如何表達及存儲的。
(2)用戶可以同時使用多個迭代器遍歷一個集合。
1.4適合使用迭代器模式的情景
(1)讓用戶訪問一個集合中對象,但不想暴露對象在集合中的存儲結構。
(2)希望對遍歷不同的集合提供一個統一的介面。