迭代器模式(Iterator Pattern)

发布于:2025-05-10 ⋅ 阅读:(4) ⋅ 点赞:(0)

🧠 什么是迭代器模式?

迭代器模式是一种行为型设计模式,允许我们在不暴露对象内部结构的情况下,通过一个统一的接口遍历集合中的元素。


🎯 为什么需要迭代器模式?

  1. 解耦集合与遍历机制:如果没有迭代器,我们在集合类中可能需要直接操作数据结构,而迭代器模式提供了一种机制,将数据的存储结构和数据的遍历逻辑解耦。
  2. 统一接口:提供一个标准接口(例如 next()has_next()),可以统一访问不同集合类型(如列表、集合、字典等)。
  3. 简化代码:避免手动编写遍历逻辑,迭代器负责所有的状态管理,使得我们可以更加简洁地操作集合。

优缺点分析

优点 缺点
遍历代码统一,适用于不同类型的集合 需要额外的类(迭代器),增加代码量
简化集合类,实现遍历时不需要关注集合的内部实现 对于一些简单的集合,迭代器可能会显得过于复杂
允许顺序访问集合的元素,而不暴露内部结构 迭代器有时可能会造成性能瓶颈,尤其在处理非常大的集合时
支持遍历的暂停与恢复(通过状态管理) 不适合需要高效随机访问的场景

🧩 Python 实现:迭代器模式

假设我们有一个集合 BookCollection,用于管理书籍,并需要实现一个迭代器来遍历这些书籍。

🎯 1️⃣ 定义迭代器接口

from abc import ABC, abstractmethod

# 迭代器接口:所有迭代器都需要实现的接口
class Iterator(ABC):
    @abstractmethod
    def next(self):
        pass

    @abstractmethod
    def 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  # 初始索引为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️⃣ 客户端调用:使用迭代器遍历集合

# 创建一个书籍集合
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 的索引
需要顺序访问集合元素 处理队列、栈、文件行等
支持集合元素的动态变化 支持动态生成的集合数据(如查询结果)

总结口诀

迭代器模式
✅ 通过统一接口顺序访问集合元素,不暴露内部结构
✅ 支持遍历的暂停恢复灵活且简洁


你可以在实际应用中扩展迭代器模式来处理更复杂的遍历场景,比如递归遍历树形结构,或者动态生成数据的流式处理。需要进一步探讨或者具体的应用示例吗?


网站公告

今日签到

点亮在社区的每一天
去签到