迭代器模式(Iterator Pattern)

🧠 什么是迭代器模式?

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


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

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

优缺点分析

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

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

总结口诀

迭代器模式

✅ 通过统一接口顺序访问 集合元素,不暴露内部结构

✅ 支持遍历的暂停恢复灵活且简洁


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

相关推荐
FAREWELL000757 天前
C#进阶学习(十六)C#中的迭代器
开发语言·学习·c#·迭代器模式·迭代器
ErizJ11 天前
Golang | 迭代器模式
开发语言·golang·迭代器模式
Pasregret12 天前
迭代器模式:统一数据遍历方式的设计模式
设计模式·迭代器模式
Pasregret16 天前
迭代器模式:统一不同数据结构的遍历方式
数据结构·迭代器模式
搞不懂语言的程序员23 天前
迭代器模式深度解析与实战案例
开发语言·python·迭代器模式
hope_wisdom1 个月前
实战设计模式之迭代器模式
设计模式·迭代器模式·软件工程·架构设计·软件架构
南宫生1 个月前
Java迭代器【设计模式之迭代器模式】
java·学习·设计模式·kotlin·迭代器模式
牵牛老人1 个月前
C++设计模式-迭代器模式:从基本介绍,内部原理、应用场景、使用方法,常见问题和解决方案进行深度解析
c++·设计模式·迭代器模式
Hanson Huang1 个月前
23中设计模式-迭代器(Iterator)设计模式
java·设计模式·迭代器模式·行为型设计模式