知識整理NO.4-#迭代器模式Iterator

迭代器模式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

IteratorUMl.png

模式組成

  • 抽象迭代器(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ù)它的外部迭代器

集合對象可以在不修改客戶端的情況下,選擇不同的外部迭代器厢蒜。

例子

IteratorExample.png

何時使用

  • 需要訪問組合對象的內(nèi)容霞势,而又不暴露其內(nèi)部表示。
  • 需要通過多種方式遍歷組合對象斑鸦。
  • 需要提供一個統(tǒng)一的接口愕贡,用來遍歷各種類型的組合對象。

優(yōu)缺點(diǎn)

優(yōu)點(diǎn)

  • 1 ) 它支持以不同的方式遍歷一個聚合對象 : 復(fù)雜的聚合可用多種方式進(jìn)行遍歷鄙才。迭代器模式使得改變遍歷算法變得很容易 : 僅需用一個不同的迭代器的實例代替原先的實例即可颂鸿。你也可以自己定義迭代器的子類以支持新的遍歷。
    1. 迭代器簡化了聚合的接口 有了迭代器的遍歷接口攒庵,聚合本身就不再需要類似的遍歷接口了嘴纺。這樣就簡化了聚合的接口。
    1. 在同一個聚合上可以有多個遍歷 每個迭代器保持它自己的遍歷狀態(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)部存儲備忘錄。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末藕施,一起剝皮案震驚了整個濱河市寇损,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌裳食,老刑警劉巖矛市,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異诲祸,居然都是意外死亡浊吏,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進(jìn)店門救氯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來找田,“玉大人,你說我怎么就攤上這事着憨《昭茫” “怎么了?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵甲抖,是天一觀的道長漆改。 經(jīng)常有香客問我,道長准谚,這世上最難降的妖魔是什么挫剑? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮柱衔,結(jié)果婚禮上樊破,老公的妹妹穿的比我還像新娘。我一直安慰自己唆铐,他們只是感情好哲戚,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著艾岂,像睡著了一般惫恼。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上澳盐,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天,我揣著相機(jī)與錄音令宿,去河邊找鬼叼耙。 笑死,一個胖子當(dāng)著我的面吹牛粒没,可吹牛的內(nèi)容都是我干的筛婉。 我是一名探鬼主播,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼爽撒!你這毒婦竟也來了入蛆?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤硕勿,失蹤者是張志新(化名)和其女友劉穎哨毁,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體源武,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡扼褪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了粱栖。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片话浇。...
    茶點(diǎn)故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖闹究,靈堂內(nèi)的尸體忽然破棺而出幔崖,到底是詐尸還是另有隱情,我是刑警寧澤渣淤,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布赏寇,位于F島的核電站,受9級特大地震影響砂代,放射性物質(zhì)發(fā)生泄漏蹋订。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一刻伊、第九天 我趴在偏房一處隱蔽的房頂上張望露戒。 院中可真熱鬧,春花似錦捶箱、人聲如沸智什。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽荠锭。三九已至,卻和暖如春晨川,著一層夾襖步出監(jiān)牢的瞬間证九,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工共虑, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留愧怜,地道東北人。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓妈拌,卻偏偏與公主長得像拥坛,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 1 場景問題# 1.1 工資表數(shù)據(jù)的整合## 考慮這樣一個實際應(yīng)用:整合工資表數(shù)據(jù)猜惋。 這個項目的背景是這樣的丸氛,項目...
    七寸知架構(gòu)閱讀 2,524評論 0 53
  • 目錄 本文的結(jié)構(gòu)如下: 引言 什么是迭代器模式 模式的結(jié)構(gòu) 典型代碼 代碼示例 優(yōu)點(diǎn)和缺點(diǎn) 適用環(huán)境 模式應(yīng)用 一...
    w1992wishes閱讀 510評論 0 1
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)著摔,斷路器缓窜,智...
    卡卡羅2017閱讀 134,599評論 18 139
  • 設(shè)計模式匯總 一、基礎(chǔ)知識 1. 設(shè)計模式概述 定義:設(shè)計模式(Design Pattern)是一套被反復(fù)使用梨撞、多...
    MinoyJet閱讀 3,903評論 1 15
  • 寫作背景:《城南舊事》是林海音以其7歲到13歲的生活為背景雹洗,在臺灣被日本帝國主義侵占期間,林海音一家不甘在日寇鐵蹄...
    王晨杉閱讀 437評論 0 0