天天看點

iOS設計模式之疊代器模式疊代器模式

疊代器模式(iterrator):提供一個方法順序通路一個聚合對象中的各個元素,而又不暴露該元素的内部表示。

當你通路一個聚合對象,而且不管這些對象是什麼都需要周遊的時候,你就應該考慮用疊代器模式。

你需要對聚集有多種方式周遊時,可以考慮用疊代器模式。

疊代器模式就是分離了集合對象的周遊行為,抽象出一個疊代器類來負責,這樣既可以做到不暴露集合的内部結構,又可讓外部代碼透明地通路集合内部的資料。

疊代器定義了一個用于通路集合元素并記錄目前元素的接口。

不同的疊代器可以執行不同的疊代政策。

外部疊代器和内部疊代器

外部疊代器

外部疊代器讓用戶端直接操作疊代過程,是以用戶端需要知道外部疊代器才能使用。但是它為用戶端提供了更多的控制

用戶端建立并維護外部疊代器

用戶端可以使用不同外部疊代器實作多種類型的周遊

内部疊代器

用戶端不需要知道任何外部疊代器,而是可以通過集合對象的特殊接口,或者一次通路一個元素,或者向集合中的每個元素發送消息。

集合對象本身建立并維護它的外部疊代器

集合對象可以在不修改用戶端代碼的情況下,選擇不同的外部疊代器

需要通路組合對象的内容,而又不是暴露其内部标示

需要通過多種方式周遊組合對象

需要提供一個統一的接口,用來周遊各種類型的組合對象

蘋果公司用自己命名規則“枚舉器/枚舉”改寫了疊代器模式,用于相關基礎類的各種方法。也就是說枚舉就是蘋果版本的疊代。

基礎架構中的nsenumerator類實作了疊代器模式。抽象nsenumerator類的私有具體子類傳回枚舉器對象,能夠順序周遊各種幾何--數組、集(set)、字典(值與鍵),把集合的對象傳回給用戶端。

nsenumerator可以枚舉nsarray/nsdictionary和nsset對象中的元素。它本身是個抽象類。它依靠幾個工廠方法,如objectenumerator或keyenumerator,來建立并傳回相應的具體枚舉器對象。

從ios4開始,有了另一種枚舉cocoa touch架構中集合對象的方法,叫做基于塊的枚舉。

快速枚舉,這個是蘋果推薦的枚舉方法。它允許把集合對象的枚舉直接用作for循環的一部分,無需使用其他枚舉器對象,而且比傳統的基于索引的for循環效率更高,形如:

該例子定義了一個集合set和一個疊代器concreteiterator。然後通過疊代器來輸出集合set對象的元素。

concreteset.h

concreteset.m

concreteiterator.h

concreteiterator.m

然後在viewcontroller中測試

用自己定義的疊代器去輸出元素和用蘋果枚舉效果類似。蘋果推薦使用類似與viewdidload方法中的for循環來輸出集合元素。

繼續閱讀