1. 程式人生 > >迭代器 ----- 設計模式

迭代器 ----- 設計模式

1前言

在面向物件中,針對抽象集合迭代行為的設計模式稱為迭代器。

2 詳述

2.1 簡述

迭代器提供了一種順序訪問聚合物件(集合)中元素的方法,而無需暴露結構的底層表示和細節。便利集合中元素的只能從集合本身轉移到迭代器物件。迭代器定義了一個用於訪問集合元素並記錄當前元素的介面。不同的迭代器可以執行不同的遍歷策略。

提供一種方法順序訪問一個聚合物件中得各個元素,而又不需暴露該物件的內部表示。

2.2 分類

外部迭代器:讓客戶端直接操作迭代過程,所以客戶端需要知道外部迭代器才能使用。

內部迭代器:集合物件(被迭代的目標物件)在其內部維護並操作一個外部迭代器。提供內部迭代器的典型的集合物件為客戶端定義一個介面,或者從底層的集合一次訪問一個元素,或者向每個元素髮送訊息。

2.3 何時使用

(1)需要訪問組合物件的內容,而又不暴露其內部表示;

(2)需要通過多種方式遍歷組合物件;

(3)需要提供一個統一的介面,用來遍歷各種型別的組合物件。

3 快速列舉

Objective-C2.0提供了一種列舉,稱為快速列舉。它是蘋果公司推薦的列舉方法。它允許把對集合物件的列舉直接用作for迴圈的一部分,無需使用其他列舉器物件,而且比傳統的基於索引的for迴圈效率更高。快速列舉的語法如下:

NSArray* anArray =...;for(NSString* item in anArray){// 對item作些處理}

現在列舉迴圈使用指標運算(pointer arithmetic),讓它比使用NSEnumerator的標準方法效率更高。

要利用快速列舉,集合類需要實現NSFastEnumeration協議,以向執行庫提供關於集合的必要資訊。基礎框架中的所有集合類與NSEnumerator類都支援快速列舉。因此不必使用while迴圈從NSEnumerator列舉每個元素,直到nextObject返回nil,我們可以使用其快速列舉的版本,如下面的程式碼段所示:

NSArray* anArray =...;NSEnumerator* itemEnumerator =[anArray objectEnumerator];for(NSString* item in itemEnumerator){// 對item作些處理 }

雖然既可以使用集合物件的快速列舉,也可以使用列舉器的快速列舉,但如果只需要預設遍歷(通常只按升序),直接對集合物件進行快速列舉更為合理。NSEnumerator使用其nextObject方法實現NSFastEnumeration協議。從效能上說,它比直接在while迴圈中手動呼叫這個方法好不了多少。儘管跟傳統的使用nextObject的while迴圈相比,快速列舉中的for迴圈顯得更為整潔。

4內部列舉

NSArray有個例項方法叫(void)makeObjectsPerformSelector:(SEL)aSelector,它允許客戶端向陣列中每個元素髮送一個訊息,讓每個元素執行指定的aSelector(假定元素支援它)。可以用前面提到的任何一種列舉方法讓每個元素執行相同的選擇器,達到相同的目的。這個方法在內部列舉集合並向每個元素髮送performSelector:訊息。這種方式的缺點是如果集合中任何元素不響應選擇器,就會丟擲異常。因此它主要適用於不需太多執行時檢查的簡單操作。