迭代器模式(Iterator Pattern)
🧠 什么是迭代器模式?
迭代器模式是一种行为型设计模式,允许我们在不暴露对象内部结构的情况下,通过一个统一的接口遍历集合中的元素。
🎯 为什么需要迭代器模式?
- 解耦集合与遍历机制:如果没有迭代器,我们在集合类中可能需要直接操作数据结构,而迭代器模式提供了一种机制,将数据的存储结构和数据的遍历逻辑解耦。
- 统一接口:提供一个标准接口(例如
next()
和has_next()
),可以统一访问不同集合类型(如列表、集合、字典等)。 - 简化代码:避免手动编写遍历逻辑,迭代器负责所有的状态管理,使得我们可以更加简洁地操作集合。
✅ 优缺点分析
✅ 优点 | ❌ 缺点 |
---|---|
遍历代码统一,适用于不同类型的集合 | 需要额外的类(迭代器),增加代码量 |
简化集合类,实现遍历时不需要关注集合的内部实现 | 对于一些简单的集合,迭代器可能会显得过于复杂 |
允许顺序访问集合的元素,而不暴露内部结构 | 迭代器有时可能会造成性能瓶颈,尤其在处理非常大的集合时 |
支持遍历的暂停与恢复(通过状态管理) | 不适合需要高效随机访问的场景 |
🧩 Python 实现:迭代器模式
假设我们有一个集合 BookCollection
,用于管理书籍,并需要实现一个迭代器来遍历这些书籍。
🎯 1️⃣ 定义迭代器接口
from abc import ABC, abstractmethod# 迭代器接口:所有迭代器都需要实现的接口
class Iterator(ABC):@abstractmethoddef next(self):pass@abstractmethoddef has_next(self):pass
🎯 2️⃣ 具体集合类(BookCollection)
class BookCollection:def __init__(self):self.books = [] # 存储书籍的列表def add_book(self, book):self.books.append(book)def get_iterator(self):return BookIterator(self.books)
🎯 3️⃣ 具体迭代器类(BookIterator)
class BookIterator(Iterator):def __init__(self, books):self.books = books # 书籍列表self.index = 0 # 初始索引为0def next(self):if self.has_next():book = self.books[self.index]self.index += 1return bookreturn Nonedef has_next(self):return self.index < len(self.books)
🎯 4️⃣ 客户端调用:使用迭代器遍历集合
# 创建一个书籍集合
book_collection = BookCollection()
book_collection.add_book("Python入门")
book_collection.add_book("设计模式")
book_collection.add_book("数据结构与算法")# 获取迭代器
iterator = book_collection.get_iterator()# 遍历集合
while iterator.has_next():print(f"书名: {iterator.next()}")
✅ 输出结果
书名: Python入门
书名: 设计模式
书名: 数据结构与算法
🧭 类图(Mermaid)
🧭 流程图(Mermaid)
🧠 应用场景总结
场景 | 示例 |
---|---|
需要遍历多个不同类型的集合 | 统一遍历多个数据结构 |
不想暴露集合内部结构 | 例如,不想让用户访问 List 的索引 |
需要顺序访问集合元素 | 处理队列、栈、文件行等 |
支持集合元素的动态变化 | 支持动态生成的集合数据(如查询结果) |
✅ 总结口诀
迭代器模式:
✅ 通过统一接口顺序访问集合元素,不暴露内部结构。
✅ 支持遍历的暂停与恢复,灵活且简洁。
你可以在实际应用中扩展迭代器模式来处理更复杂的遍历场景,比如递归遍历树形结构,或者动态生成数据的流式处理。需要进一步探讨或者具体的应用示例吗?