Swift设计模式——迭代器模式
2017-06-01 本文已影响0人
晓晓魔导师
什么是迭代器模式?
迭代器模式(Iterator Pattern)是 Java 和 .Net 编程环境中非常常用的设计模式。这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。
迭代器模式属于行为型模式。
使用场景:
- 访问一个聚合对象的内容而无须暴露它的内部表示。
- 需要为聚合对象提供多种遍历方式。
- 为遍历不同的聚合结构提供一个统一的接口。
示例:
//定义一个小说结构
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 //当方法结束后当前索引值+1
}
//如果小说集合内的小说数量大于当前索引,则返回当前索引值里的小说,返回nil
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)")
}
优点
- 它支持以不同的方式遍历一个聚合对象。
- 迭代器简化了聚合类。
- 在同一个聚合上可以有多个遍历。
- 在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码。
缺点
- 由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性。
总结
迭代器模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可让外部代码透明地访问集合内部的数据。