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


    一、说明

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

    (一) 解决问题

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

    (二) 使用场景

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

    二、结构

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

    三、伪代码

    1. #!/usr/bin/env python
    2. # -*- coding: UTF-8 -*-
    3. __doc__ = """
    4. 迭代器模式
    5. 例:迭代树结构对象
    6. """
    7. from collections.abc import Iterable, Iterator
    8. class TreeNode:
    9. """树节点类"""
    10. def __init__(self, value):
    11. self.value = value
    12. self.children = []
    13. def add_child(self, child):
    14. self.children.append(child)
    15. def __str__(self, level=0):
    16. indent = " " * level
    17. result = f"{indent}{self.value}\n"
    18. for child in self.children:
    19. result += child.__str__(level + 4)
    20. return result
    21. class Tree(Iterable):
    22. """聚合对象"""
    23. def __init__(self, root):
    24. self.root = root
    25. def __iter__(self) -> Iterator:
    26. return TreeIterator(self.root)
    27. class TreeIterator(Iterator):
    28. """迭代器"""
    29. def __init__(self, node):
    30. self.stack = [node]
    31. def __next__(self):
    32. if not self.stack:
    33. raise StopIteration
    34. node = self.stack.pop()
    35. self.stack.extend(reversed(node.children))
    36. return node.value
    37. if __name__ == "__main__":
    38. """
    39. A
    40. B
    41. D
    42. E
    43. C
    44. F
    45. """
    46. # 构建树形结构
    47. root = TreeNode("A")
    48. b = TreeNode("B")
    49. c = TreeNode("C")
    50. d = TreeNode("D")
    51. e = TreeNode("E")
    52. f = TreeNode("F")
    53. root.add_child(b)
    54. root.add_child(c)
    55. b.add_child(d)
    56. b.add_child(e)
    57. c.add_child(f)
    58. # 遍历树形结构
    59. tree = Tree(root)
    60. for value in tree:
    61. print(value)

    四、优缺点

    优点

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

    缺点

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

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

  • 相关阅读:
    static成员
    opencv-Canny 边缘检测
    chapter1——亚稳态的世界
    基于JAVA基于Web的社区商超系统的设计与实现计算机毕业设计源码+系统+mysql数据库+lw文档+部署
    Nginx-反向代理如何配置
    Kotlin的遍历方法
    C# SwinV2 Stable Diffusion 提示词反推 Onnx Demo
    面试官让手撕红黑树,我直接向他秀一手手撕map与set
    百度ERNIE 3.0——中文情感分析实战
    【成为红帽工程师】第一天 例行性工作与chrony服务器
  • 原文地址:https://blog.csdn.net/weixin_44904331/article/details/136261148