美文网首页
二十七、解决问题的“第三者”----迭代器模式

二十七、解决问题的“第三者”----迭代器模式

作者: LeeLeCoder | 来源:发表于2017-09-12 19:46 被阅读0次

    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. 优缺点

    • 优点

      • 它支持以不同的方式遍历一个聚合对象。
      • 迭代器简化了聚合类。
      • 在同一个聚合上可以有多个遍历。
      • 在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码。
    • 缺点

      • 由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性。

    相关文章

      网友评论

          本文标题:二十七、解决问题的“第三者”----迭代器模式

          本文链接:https://www.haomeiwen.com/subject/peahkxtx.html