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

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

  • 优点

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

    • 由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1 场景问题# 1.1 工资表数据的整合## 考虑这样一个实际应用:整合工资表数据。 这个项目的背景是这样的,项目...
    七寸知架构阅读 7,351评论 0 53
  • 目录 本文的结构如下: 引言 什么是迭代器模式 模式的结构 典型代码 代码示例 优点和缺点 适用环境 模式应用 一...
    w1992wishes阅读 3,532评论 0 1
  • 设计模式汇总 一、基础知识 1. 设计模式概述 定义:设计模式(Design Pattern)是一套被反复使用、多...
    MinoyJet阅读 9,390评论 1 15
  • 迭代器模式Iterator 背景 概述 类中的面向对象编程封装应用逻辑。类,就是实例化的对象,每个单独的对象都有一...
    践行者阅读 3,514评论 1 3
  • 声音 近一点儿 心脏收缩血管跳动的声音 眨眼的声音 滋啦啦磨牙的声音 平稳的呼吸的声音 有节奏的呼噜声 远一点 还...
    话梅煮酒ccmm阅读 2,720评论 0 0

友情链接更多精彩内容