二十七、解決問題的“第三者”----迭代器模式

1. 何為迭代器模式

迭代器提供了一種順序訪問聚合對象(集合)中元素的方法宪萄,而無需暴露結(jié)構(gòu)的底層表示和細節(jié)拜英。遍歷集合中元素的職能從集合本身轉(zhuǎn)移到迭代器對象。迭代器定義了一個用于訪問集合元素并記錄當前元素的接口。不同的迭代器可以執(zhí)行不同的遍歷策略弄兜。

迭代器:提供一種方法順序訪問一個聚合對象中各個元素替饿,而又不暴露該對象的內(nèi)部表示盛垦。

2. 何時使用迭代器模式

以下情形腾夯,自然會想到使用迭代器模式:

  • 需要訪問組合對象的內(nèi)容班利,而又不暴露其內(nèi)部表示;
  • 需要通過多種方式遍歷組合對象闯割;
  • 需要提供一個統(tǒng)一的接口,用來遍歷各種類型的組合對象谢澈;

3. 迭代器的UML類圖

根據(jù)類圖可以得出如下一個迭代器模式的通用模式代碼:

4.代碼示例

import Foundation

// 定義一個小說結(jié)構(gòu)體
struct Novella {
    let name: String // 小說名
}

// 定義一個小說集合結(jié)構(gòu)
struct Novellas {
    let novellas: [Novella] // 存放小說
}

// 定義一個小說迭代器(遵循Swift的迭代器協(xié)議)
struct NovellasIterator: IteratorProtocol {
    private var current = 0 // 當前索引
    private let novellas: [Novella]
    
    init(novellas: [Novella]) {
        self.novellas = novellas
    }
    
    // 實現(xiàn)協(xié)議方法
    mutating func next() -> Novella? {
        defer {
            current += 1
        }
        
        return novellas.count > current ? novellas[current] : nil
    }
}

// 將小說集合遵循Swift序列協(xié)議
extension Novellas: Sequence {
    // 實現(xiàn)協(xié)議方法(制作一個小說迭代器)
    func makeIterator() -> NovellasIterator {
        return NovellasIterator(novellas: novellas)
    }
}

// MAKE: Usage
// 創(chuàng)建小說迭代器并添加些小說
let greatNovellas = Novellas(novellas: [Novella(name: "The Mist"), Novella(name: "The Mist2")])

// 遍歷取出小說閱讀
for novella in greatNovellas {
    print("I 've read: \(novella)")
}

運行結(jié)果:

5. 優(yōu)缺點

  • 優(yōu)點

    • 它支持以不同的方式遍歷一個聚合對象。
    • 迭代器簡化了聚合類。
    • 在同一個聚合上可以有多個遍歷。
    • 在迭代器模式中,增加新的聚合類和迭代器類都很方便鲫懒,無須修改原有代碼。
  • 缺點

    • 由于迭代器模式將存儲數(shù)據(jù)和遍歷數(shù)據(jù)的職責分離晃洒,增加新的聚合類需要對應增加新的迭代器類,類的個數(shù)成對增加,這在一定程度上增加了系統(tǒng)的復雜性。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末纺荧,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子宙暇,更是在濱河造成了極大的恐慌输枯,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件占贫,死亡現(xiàn)場離奇詭異桃熄,居然都是意外死亡,警方通過查閱死者的電腦和手機型奥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進店門瞳收,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人厢汹,你說我怎么就攤上這事螟深。” “怎么了烫葬?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵界弧,是天一觀的道長。 經(jīng)常有香客問我搭综,道長垢箕,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任兑巾,我火速辦了婚禮条获,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蒋歌。我一直安慰自己帅掘,他們只是感情好委煤,可當我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著锄开,像睡著了一般素标。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上萍悴,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天头遭,我揣著相機與錄音癣诱,去河邊找鬼计维。 笑死,一個胖子當著我的面吹牛撕予,可吹牛的內(nèi)容都是我干的鲫惶。 我是一名探鬼主播,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼实抡,長吁一口氣:“原來是場噩夢啊……” “哼欠母!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起吆寨,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤赏淌,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后啄清,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體六水,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年辣卒,在試婚紗的時候發(fā)現(xiàn)自己被綠了掷贾。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡荣茫,死狀恐怖想帅,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情啡莉,我是刑警寧澤博脑,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站票罐,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏泞边。R本人自食惡果不足惜该押,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望阵谚。 院中可真熱鬧蚕礼,春花似錦烟具、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至囤躁,卻和暖如春冀痕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背狸演。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工言蛇, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人宵距。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓腊尚,卻偏偏與公主長得像,于是被迫代替她去往敵國和親满哪。 傳聞我的和親對象是個殘疾皇子婿斥,可洞房花燭夜當晚...
    茶點故事閱讀 43,440評論 2 348

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

  • 1 場景問題# 1.1 工資表數(shù)據(jù)的整合## 考慮這樣一個實際應用:整合工資表數(shù)據(jù)。 這個項目的背景是這樣的哨鸭,項目...
    七寸知架構(gòu)閱讀 2,535評論 0 53
  • 目錄 本文的結(jié)構(gòu)如下: 引言 什么是迭代器模式 模式的結(jié)構(gòu) 典型代碼 代碼示例 優(yōu)點和缺點 適用環(huán)境 模式應用 一...
    w1992wishes閱讀 510評論 0 1
  • 設(shè)計模式匯總 一民宿、基礎(chǔ)知識 1. 設(shè)計模式概述 定義:設(shè)計模式(Design Pattern)是一套被反復使用、多...
    MinoyJet閱讀 3,919評論 1 15
  • 迭代器模式Iterator 背景 概述 類中的面向?qū)ο缶幊谭庋b應用邏輯兔跌。類勘高,就是實例化的對象,每個單獨的對象都有一...
    踐行者閱讀 518評論 1 3
  • 聲音 近一點兒 心臟收縮血管跳動的聲音 眨眼的聲音 滋啦啦磨牙的聲音 平穩(wěn)的呼吸的聲音 有節(jié)奏的呼嚕聲 遠一點 還...
    話梅煮酒ccmm閱讀 352評論 0 0