【Python笔记-设计模式】迭代器模式

一、说明

迭代器模式是一种行为设计模式,让你能在不暴露集合底层表现形式(列表、栈和树等)的情况下遍历集合中所有的元素。

(一) 解决问题

遍历聚合对象中的元素,而不需要暴露该对象的内部表示

(二) 使用场景

  • 需要对聚合对象中元素进行遍历,并且不想暴露其内部结构
  • 减少程序中重复的遍历代码时
  • 能够遍历不同的甚至是无法预知的数据结构时

二、结构

  1. **迭代器(Iterator)**接口声明了遍历集合所需的操作:获取下一个元素、获取当前位置和重新开始迭代等。
  2. **具体迭代器(ConcreteIterators)**实现遍历集合的一种特定算法。迭代器对象必须跟踪自身遍历的进度。这使得多个迭代器可以相互独立地遍历同一集合。
  3. **集合(Collection)**接口声明一个或多个方法来获取与集合兼容的迭代器。请注意,返回方法的类型必须被声明为迭代器接口,因此具体集合可以返回各种不同种类的迭代器。
  4. **具体集合(ConcreteCollections)**会在客户端请求迭代器时返回一个特定的具体迭代器类实体。你可能会琢磨,剩下的集合代码在什么地方呢?不用担心,它也会在同一个类中。只是这些细节对于实际模式来说并不重要,所以我们将其省略了而已。
  5. **客户端(Client)**通过集合和迭代器的接口与两者进行交互。这样一来客户端无需与具体类进行耦合,允许同一客户端代码使用各种不同的集合和迭代器。客户端通常不会自行创建迭代器,而是会从集合中获取。但在特定情况下,客户端可以直接创建一个迭代器(例如当客户端需要自定义特殊迭代器时)。

三、伪代码

python 复制代码
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
__doc__ = """
迭代器模式

例:迭代树结构对象
"""

from collections.abc import Iterable, Iterator


class TreeNode:
    """树节点类"""

    def __init__(self, value):
        self.value = value
        self.children = []

    def add_child(self, child):
        self.children.append(child)

    def __str__(self, level=0):
        indent = " " * level
        result = f"{indent}{self.value}\n"
        for child in self.children:
            result += child.__str__(level + 4)
        return result


class Tree(Iterable):
    """聚合对象"""

    def __init__(self, root):
        self.root = root

    def __iter__(self) -> Iterator:
        return TreeIterator(self.root)


class TreeIterator(Iterator):
    """迭代器"""

    def __init__(self, node):
        self.stack = [node]

    def __next__(self):
        if not self.stack:
            raise StopIteration

        node = self.stack.pop()
        self.stack.extend(reversed(node.children))
        return node.value


if __name__ == "__main__":
    """
        A
        B
        D
        E
        C
        F
    """
    # 构建树形结构
    root = TreeNode("A")
    b = TreeNode("B")
    c = TreeNode("C")
    d = TreeNode("D")
    e = TreeNode("E")
    f = TreeNode("F")

    root.add_child(b)
    root.add_child(c)
    b.add_child(d)
    b.add_child(e)
    c.add_child(f)

    # 遍历树形结构
    tree = Tree(root)
    for value in tree:
        print(value)

四、优缺点

优点

  • **简化了聚合对象的接口:**迭代器模式将遍历集合元素的责任分离出来,使得聚合对象和迭代器对象的职责更加清晰,聚合对象只需提供迭代器而无需关注遍历逻辑。
  • **隐藏了集合的内部结构:**迭代器模式封装了集合的内部实现细节,使得客户端可以透明地访问集合元素,而不必关心集合的具体实现方式。

缺点

  • **不适合过于简单的集合:**对于结构简单、元素数量少的集合,不如直接遍历集合来得简单直接。

【Python笔记】设计模式-CSDN博客

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