1. 何为迭代器模式
迭代器提供了一种顺序访问聚合对象(集合)中元素的方法,而无需暴露结构的底层表示和细节。遍历集合中元素的职能从集合本身转移到迭代器对象。迭代器定义了一个用于访问集合元素并记录当前元素的接口。不同的迭代器可以执行不同的遍历策略。
迭代器:提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。
2. 何时使用迭代器模式
以下情形,自然会想到使用迭代器模式:
- 需要访问组合对象的内容,而又不暴露其内部表示;
- 需要通过多种方式遍历组合对象;
- 需要提供一个统一的接口,用来遍历各种类型的组合对象;
3. 迭代器的UML类图
根据类图可以得出如下一个迭代器模式的通用模式代码:
4.代码示例
import Foundation
// 定义一个小说结构体
struct Novella {
let name: String // 小说名
}
// 定义一个小说集合结构
struct Novellas {
let novellas: [Novella] // 存放小说
}
// 定义一个小说迭代器(遵循Swift的迭代器协议)
struct NovellasIterator: IteratorProtocol {
private var current = 0 // 当前索引
private let novellas: [Novella]
init(novellas: [Novella]) {
self.novellas = novellas
}
// 实现协议方法
mutating func next() -> Novella? {
defer {
current += 1
}
return novellas.count > current ? novellas[current] : nil
}
}
// 将小说集合遵循Swift序列协议
extension Novellas: Sequence {
// 实现协议方法(制作一个小说迭代器)
func makeIterator() -> NovellasIterator {
return NovellasIterator(novellas: novellas)
}
}
// MAKE: Usage
// 创建小说迭代器并添加些小说
let greatNovellas = Novellas(novellas: [Novella(name: "The Mist"), Novella(name: "The Mist2")])
// 遍历取出小说阅读
for novella in greatNovellas {
print("I 've read: \(novella)")
}
运行结果:
5. 优缺点
-
优点
- 它支持以不同的方式遍历一个聚合对象。
- 迭代器简化了聚合类。
- 在同一个聚合上可以有多个遍历。
- 在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码。
-
缺点
- 由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性。