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)的復雜性。