GOF 迭代器模式

迭代器模式是一种行为型设计模式,它允许使用聚合对象的顺序而无需暴露其内部结构。通过提供一个接口来顺序访问聚合元素,迭代器简化了聚合类并支持多种遍历方式。该模式的主要优点包括不暴露内部结构、易于扩展和良好的封装性,但也存在增加系统复杂性的缺点。在模式结构中,抽象聚合定义接口,具体聚合实现这些接口,抽象迭代器定义遍历操作,而具体迭代器则实现了遍历逻辑。

GOF 行为型模式 系列文章

  1. 迭代器模式
  2. 模版方法模式
  3. 观察者模式
  4. 访问者模式
  5. 命令模式
  6. 中介者模式
  7. 备忘录模式
  8. 解释器模式
  9. 状态模式
  10. 策略模式
  11. 职责链模式


1. 概述

  • 定义

    • 提供一个对象来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示。迭代器模式是一种对象行为型模式
    • 又称为: 游标cursor模式
  • 主要优点

    • 访问一个聚合对象的内容而无须暴露它的内部表示。
    • 遍历任务交由迭代器完成,这简化了聚合类。
    • 它支持以不同方式遍历一个聚合,甚至可以自定义迭代器的子类以支持新的遍历。
    • 增加新的聚合类和迭代器类都很方便,无须修改原有代码。
    • 封装性良好,为遍历不同的聚合结构提供一个统一的接口。
  • 主要缺点

    • 增加了类的个数,这在一定程度上增加了系统的复杂性。
  • 模式结构

    • 抽象聚合(Aggregate)角色:定义存储、添加、删除聚合对象以及创建迭代器对象的接口。
    • 具体聚合(ConcreteAggregate)角色:实现抽象聚合类,返回一个具体迭代器的实例。
    • 抽象迭代器(Iterator)角色:定义访问和遍历聚合元素的接口,通常包含 hasNext()、first()、next() 等方法。
    • 具体迭代器(Concretelterator)角色:实现抽象迭代器接口中所定义的方法,完成对聚合对象的遍历,记录遍历的当前位置。
      在这里插入图片描述

参考链接

  1. 尚学堂_迭代器模式
  2. C语言中文网_迭代器模式
<think> 嗯,用户想了解迭代器模式的来源,这个问题涉及设计模式的历史背景。从对话历史看,用户之前已经接触过迭代器的基本概念,现在想深入探究其起源。 用户提供的四篇引用材料很有价值,特别是引用[1]和引用[4]直接提到了迭代器模式的起源。引用[1]提到"多态迭代"的概念,引用[4]则明确指向《图解设计模式》这本书。这些线索需要重点参考。 首先需要明确迭代器模式的核心价值:解耦遍历算法与数据结构。引用[1]和引用[3]都强调了这一点,特别是引用[3]提到"与结构无关的遍历机制",这是理解迭代器本质的关键。 关于具体来源,引用[4]给出了最直接的线索——GoF的《设计模式》著作。这本书确实是迭代器模式的理论基石,1994年出版时系统整理了23种设计模式。需要特别指出的是,虽然模式名称是GoF提出的,但迭代的思想更早就存在于编程实践中。 可能还需要区分两个概念:迭代器作为编程思想的存在,和迭代器作为设计模式的正式提出。前者可以追溯到更早期的编程语言,比如Smalltalk的集合遍历方式;后者才是GoF的规范化贡献。 另外注意到引用[2]提到了Java集合框架的实现,这可以作为模式应用的实例补充。但用户主要问的是来源而非实现,所以这部分只需简要提及。 最后考虑在回答中安排这样的结构:先说明GoF的奠基作用,再追溯更早期的实践雏形,最后点明模式的核心创新点——多态迭代。这样既回答来源问题,也呼应了用户引用的材料。 </think> 迭代器模式的来源可追溯至软件工程中对**遍历逻辑与数据结构解耦**的核心需求,其发展历程主要分为以下关键阶段: --- ### 一、理论奠基:GoF 的《设计模式》(1994) **核心贡献**: Erich Gamma 等人在著作《设计模式:可复用面向对象软件的基础》中首次将迭代器定义为独立的设计模式(Iterator Pattern)[^4]。 **核心思想**: 1. **抽象遍历接口**:定义 `next()`, `hasNext()` 等方法,统一访问集合元素的方式。 2. **解耦数据结构**:客户端只需依赖迭代器接口,无需了解集合内部实现(如数组、树、链表)。 3. **支持多态迭代**:针对同一集合可提供不同遍历策略(如正序/倒序)[^1]。 > **示例伪代码**: > ```typescript > interface Iterator<T> { > hasNext(): boolean; > next(): T; > } > > class ArrayIterator implements Iterator<Item> { > // 隐藏数组遍历细节 > } > ``` --- ### 二、早期实践:Smalltalk 语言(1970s) **实际先驱**: 在 GoF 著作出版前,Smalltalk 语言已内置类似实现: - 集合类提供 `do:` 方法遍历元素。 - 通过 `BlockClosure`(代码块)传递遍历逻辑,实现业务与迭代解耦[^3]。 > 这为迭代器模式提供了实践雏形。 --- ### 三、核心驱动力:解决遍历痛点 1. **遍历逻辑重复** 不同集合(数组/链表/树)需编写不同遍历代码,违反 DRY 原则。 2. **数据结构暴露** 客户端直接操作集合内部结构(如 `get(index)`),导致耦合。 3. **多遍历策略需求** 同一集合需支持多种遍历方式(如 DFS/BFS),传统方法难以扩展[^1][^4]。 --- ### 四、模式意义与演进 | **阶段** | **贡献** | **代表** | |----------------|-----------------------------------|------------------| | 理论规范化 | 定义模式结构与接口 | GoF设计模式》 | | 语言集成 | 内置迭代器支持 | Java `Iterator` | | 函数式扩展 | 结合高阶函数(如 `map/filter`) | RxJS 流处理[^3] | > **关键演进**:从「遍历容器」到「处理数据流」,迭代器成为现代响应式编程的基石。 --- ### 五、核心价值总结 迭代器模式通过**抽象遍历行为**,从根本上解决了: 1. **解耦性**:分离数据存储与使用逻辑 2. **扩展性**:新增迭代策略无需修改集合或客户端 3. **复用性**:同一遍历逻辑适配不同数据结构[^1][^4] ```mermaid graph LR A[客户端] --> B[迭代器接口] B --> C[具体迭代器A:数组] B --> D[具体迭代器B:树] B --> E[具体迭代器C:流] ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值