迭代器模式Iterator
背景
概述
類中的面向?qū)ο缶幊谭庋b應(yīng)用邏輯。類,就是實例化的對象,每個單獨(dú)的對象都有一個特定的身份和狀態(tài)裸扶。單獨(dú)的對象是一種組織代碼的有用方法,但通常你會處理一組對象或者集合搬素。
集合不一定是均一的呵晨。圖形用戶界面框架中的 Window 對象可以收集任意數(shù)量的控制對象 - Menu、Slider 和 Button熬尺。并且摸屠,集合的實現(xiàn)可以有多種方式:PHP 數(shù)字是一個集合,但也是一個散列表粱哼,一個鏈接列表季二,一個堆棧以及隊列。
問題
如何操縱任意的對象集合揭措?
如一個列表(List)或者一個集合(Set)胯舷,我們又如何提供一種方法來讓別人可以訪問它的元素,而又不需要暴露它的內(nèi)部結(jié)構(gòu)绊含?
解決方案
迭代器模式:使用迭代器模式來提供對聚合對象的統(tǒng)一存取桑嘶,即提供一個外部的迭代器來對聚合對象進(jìn)行訪問和遍歷 , 而又不需暴露該對象的內(nèi)部結(jié)構(gòu)。又叫做游標(biāo)(Cursor)模式 艺挪。
你可能沒有意識到這一點(diǎn)不翩,但你每天都在使用迭代器模式 。
剖析
意圖
- 在沒有公開其底層表示時麻裳,提供一種順序訪問聚合對象元素的方法
- C++和java 標(biāo)準(zhǔn)抽象庫解耦集合類和算法
- 提供 “full object status” 遍歷集合類
- 多態(tài)的遍歷
定義
- 提供一種方法順序訪問一個聚合對象中的各個元素,而又不需要暴露該對象的內(nèi)部表示
本質(zhì)
- 控制訪問聚合對象中的元素
UML
模式組成
- 抽象迭代器(Iterator): 迭代器定義訪問和遍歷元素的接口器钟。
- 具體迭代器(ConcreteIterator): 具體迭代器實現(xiàn)迭代器Iterator接口津坑。對該聚合遍歷時跟蹤當(dāng)前位置。
- 抽象聚合類(Aggregate): 聚合定義創(chuàng)建相應(yīng)迭代器對象的接口傲霸。
- 具體聚合類(ConcreteAggregate): 體聚合實現(xiàn)創(chuàng)建相應(yīng)迭代器的接口疆瑰,該操作返回ConcreteIterator的一個適當(dāng)?shù)膶嵗?/li>
分類
外部迭代器:讓客戶端直接操作迭代過程,所以客戶端需要知道外部迭代器才能使用昙啄。
內(nèi)部迭代器:集合對象在其內(nèi)部維護(hù)并操作一個外部迭代器穆役。提供內(nèi)部迭代器的典型的集合對象為客戶端定義一個接口,或者從底層的集合一次訪問一個元素梳凛,或者向每一個元素發(fā)送消息耿币。外部迭代器與內(nèi)部迭代器的區(qū)別:
外部迭代器:
客戶端需要知道外部迭代器才能使用,但是他為客戶端提供了更多的控制韧拒⊙徒樱客戶端創(chuàng)建并維護(hù)了更多的控制客戶端可以使用不同外部迭代器實現(xiàn)多種類型的遍歷十性。
內(nèi)部迭代器:
客戶端不需要知道任何外部迭代器,而是可以通過集合對象的特殊接口塑悼,或者向集合中的每一個元素發(fā)送消息劲适。
集合對象本身創(chuàng)建并維護(hù)它的外部迭代器
集合對象可以在不修改客戶端的情況下,選擇不同的外部迭代器厢蒜。
例子
何時使用
- 需要訪問組合對象的內(nèi)容霞势,而又不暴露其內(nèi)部表示。
- 需要通過多種方式遍歷組合對象斑鸦。
- 需要提供一個統(tǒng)一的接口愕贡,用來遍歷各種類型的組合對象。
優(yōu)缺點(diǎn)
優(yōu)點(diǎn)
- 1 ) 它支持以不同的方式遍歷一個聚合對象 : 復(fù)雜的聚合可用多種方式進(jìn)行遍歷鄙才。迭代器模式使得改變遍歷算法變得很容易 : 僅需用一個不同的迭代器的實例代替原先的實例即可颂鸿。你也可以自己定義迭代器的子類以支持新的遍歷。
- 迭代器簡化了聚合的接口 有了迭代器的遍歷接口攒庵,聚合本身就不再需要類似的遍歷接口了嘴纺。這樣就簡化了聚合的接口。
- 在同一個聚合上可以有多個遍歷 每個迭代器保持它自己的遍歷狀態(tài)浓冒。因此你可以同時進(jìn)行多個遍歷栽渴。
- 4)在迭代器模式中,增加新的聚合類和迭代器類都很方便稳懒,無須修改原有代碼闲擦,滿足“開閉原則”的要求。
缺點(diǎn)
- 由于迭代器模式將存儲數(shù)據(jù)和遍歷數(shù)據(jù)的職責(zé)分離场梆,增加新的聚合類需要對應(yīng)增加新的迭代器類墅冷,類的個數(shù)成對增加,這在一定程度上增加了系統(tǒng)的復(fù)雜性或油。
總結(jié)
- 1)聚合是一個管理和組織數(shù)據(jù)對象的數(shù)據(jù)結(jié)構(gòu)寞忿。
- 2)聚合對象主要擁有兩個職責(zé):一是存儲內(nèi)部數(shù)據(jù);二是遍歷內(nèi)部數(shù)據(jù)顶岸。
- 3)存儲數(shù)據(jù)是聚合對象最基本的職責(zé)腔彰。
- 4)將遍歷聚合對象中數(shù)據(jù)的行為提取出來,封裝到一個迭代器中辖佣,通過專門的迭代器來遍歷聚合對象的內(nèi)部數(shù)據(jù)霹抛,這就是迭代器模式的本質(zhì)。迭代器模式是“單一職責(zé)原則”的完美體現(xiàn)卷谈。
經(jīng)驗法則
- 解釋器模式抽象點(diǎn)語法樹是組合模式(因此 迭代器 和訪問者模式很使用)
- 迭代器模式遍歷整個組合;訪問者模式應(yīng)用在組合操作上
- 多態(tài)的迭代器依賴工廠方法子類化適當(dāng) 的迭代器
- 備忘錄通常和迭代器模式一起使用杯拐。迭代器模式使用備忘錄捕獲迭代器的狀態(tài)。迭代器內(nèi)部存儲備忘錄。