设计模式 - 迭代器模式 笔记

设计目的:

提供一种方法顺序访问一个聚合对象(如数组、链表、树)中的各个元素,而又不需要暴露该对象的内部表示。

没有迭代器模式之前,如果你想遍历一个集合,你必须知道这个集合的底层结构。

  • 如果它是数组 ,你需要用 for (int i=0; i<len; i++)

  • 如果它是链表 ,你需要通过 node.next 来遍历。

  • 如果它是树结构,你可能需要写复杂的递归深度优先或广度优先遍历。

客户端代码如果与集合的内部结构紧密耦合。如果哪天你想把底层的数组改成链表,所有遍历它的代码都得跟着改。有了迭代器就可以让你在不明确集合类型时先写好代码,消除变更顾虑。


核心结构

  • 迭代器接口 :声明 hasNext()next() 等遍历方法。

  • 具体迭代器:实现遍历算法,记录当前位置。

  • 集合接口 :声明 createIterator() 工厂方法。

  • 具体集合:返回对应的具体迭代器实例。

工作方式 :客户端通过集合接口获取迭代器,然后循环调用 hasNext()next() 访问元素,完全解除了客户端与集合内部结构的耦合。


迭代器模式是现代编程语言中的"内置公民",foreach 就是迭代器模式的语法糖:

  • Javajava.util.Iterator 接口,foreach 语法糖会编译成 while(iterator.hasNext())

  • C#IEnumerator 接口,foreach 直接依赖它

  • Python :迭代器协议(__iter____next__),for in 循环底层就是调用它

  • JavaScriptSymbol.iterator 协议,for...of 循环使用它

  • RustIterator trait,for 循环会自动调用 into_iter()

  • Go :虽然没泛型迭代器,但 for range 对 slice/map/channel 也是类似思想

相关推荐
To_OC15 小时前
从一行入口代码啃透 NestJS:工厂模式、装饰器和依赖注入是怎么串起来的
后端·设计模式·nestjs
Shaoxi Zhang17 小时前
JAVA学习笔记035——对象和JSON格式
java·笔记·学习
Oll Correct17 小时前
Adobe illustrator 案例六:手枪图标绘制
笔记·ui·adobe·illustrator
东方小月17 小时前
从零开发一个 Coding Agent(十二):实现版本化 JSONL 与真实 CLI 入口
前端·设计模式·前端框架
摇滚侠18 小时前
《Docker技术入门与实战 第4版》阅读笔记 2 Docker 镜像
笔记·docker·容器
程序员贺加贝19 小时前
轻制造SaaS的生产闭环建模-BOM工单领料报工质检与入库
java·设计模式·架构
疯狂打码的少年21 小时前
【数据结构】图的遍历:深度优先搜索(DFS)
数据结构·笔记·算法·深度优先
嘟嘟071721 小时前
SDD 规范驱动开发:从 vibe coding 崩盘到"两次创造"
设计模式·代码规范·vibecoding
智者知已应修善业1 天前
【51单片机数码管逐位显示1-8余位不亮】2024-10-23
c语言·经验分享·笔记·嵌入式硬件·51单片机
Wang's Blog1 天前
PostgreSQL笔记16: 索引基础——概念、类型、创建与最佳实践
数据库·笔记·postgresql