《Java與模式》學習筆記:設計模式——迭代子(Iterator)模式

迭代子(Iterator)模式

迭代子模式又叫遊標模式,是對象的行爲模式。


1.定義:提供遍歷一個聚集的方法接口,而不需要了解聚集的內部結構(說白了就是爲不同的聚集提供相同的遍歷方式,使得客戶端只需要關注迭代接口,而不需要關注所迭代的聚集的具體結構。)


2.爲什麼需要Iterator
    迭代子相當於在客戶端和聚集之間加了一層,這樣一來,迭代子就可以緩衝客戶端或聚集的變化。使得聚集的變化對客戶端透明(由於客戶端是對迭代子編程的,只要迭代子的接口不變,聚集怎麼變都不會影響到客戶端),同樣的客戶端的需求變化對聚集也是透明的(客戶端需求變了,只需要修改迭代子的接口和實現,不需要修改聚集的結構)。這樣就將可變的部分封裝到了迭代子中,是符合"開-閉"原則的。


3.內稟子,外稟子
1)定義:
內稟子:聚集本身不提供訪問其內部元素的方法,只有通過聚集內部的迭代子來遍歷聚集,這時迭代子是個內部類,是聚集的一部分。
外稟子:聚集本身提供訪問其內部元素的方法,可以通過外部的迭代子來遍歷聚集,這時迭代子是個外部類,只維持對聚集的一個引用。

2)安全性區別:
內稟子:安全,因爲聚集不提供訪問其內部元素的方法,在迭代過程中,聚集的元素不會被客戶端繞過迭代子修改,所以不會導致迭帶過程崩潰。
外稟子:不安全,因爲聚集提供訪問其內部元素的方法,在迭代過程中,聚集的元素會被客戶端繞過迭代子修改,所以可能會導致迭帶過程崩潰。

3)何時使用外稟子:當聚集會被幾個不同的方法和對象同時共享和控制,需要這個聚集的多個迭代子分別維護各自的遊標時,使用外稟子

4)何時使用內稟子:當對安全方面的要求比較高,而且又不需要共享時。


4.一個好的Iterator應該注意的方面

1)主動迭代子和被動迭代子:
主動迭代子:客戶端用next()推動迭代過程
被動迭代子:迭代子自行推進迭代過程

2)靜態迭代子和動態迭代子(都是對外稟子來說的)
靜態迭代子:迭代子內部維持一份聚集的元素的克隆,不會出現迭代崩潰,但是對性能有影響。
動態迭代子:迭代子內部只維持一份聚集的引用,可能出現迭代崩潰

3)Fail Fast
如果當一個算法開始之後,他的運算環境發生了變化,使得算法無法進行必需的調整時,這個算法就應當立即發出故障信號


5.Iterator的優缺點
優點:
    迭代子簡化了聚集的接口,因爲迭代子提供了遍歷接口,所以聚集就可以不用提供遍歷接口。
    對於外稟子而言,一個聚集可以提供多個迭代子,而且這些迭代子的迭代狀態都是相互獨立的,這樣一個聚集可以在多個方法中被同時遍歷。
缺點:
    迭代子給客戶端一個聚集被順序化的錯覺
    迭代子給出的聚集元素沒有類型特徵,統一都是Object。


備註:在真正的開發中,不需要我們自己去實現Iterator模式,因爲Java以及許多第三方庫都已經提供了性能優秀的集合類,我們所需要做的就是把元素裝進特定的集合類,然後用Java提供的Iterator機制去遍歷聚集。就是如此簡單。研究這個模式的目的是對Java的實現有更好的理解。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章