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