• 【Python笔记-设计模式】组合模式


    一、说明

    组合模式是一种结构型设计模式, 你可以使用它将对象组合成树状结构, 并且能像使用独立对象一样使用它们。

    (一) 解决问题

    1. 处理树形结构:可以很好地处理树形结构的数据,使得用户可以统一对待单个对象和对象组合。
    2. 统一接口:可以通过统一的接口来操作单个对象和对象组合,简化了客户端的代码。
    3. 递归组合:可以通过递归的方式来处理对象组合,使得代码更加灵活。

    (二) 使用场景

    • 需要实现树状对象结构
    • 希望客户端以相同的方式处理简单和复杂元素

    二、结构

    1. 组件(Component)接口描述了树中简单项目和复杂项目所共有的操作。
    2. 叶节点(Leaf)是树的基本结构,它不包含子项目。一般情况下,叶节点最终会完成大部分的实际工作,因为它们无法将工作指派给其他部分。
    3. 容器(Container)——又名 “组合 (Composite)”——是包含叶节点或其他容器等子项目的单位。容器不知道其子项目所属的具体类,它只通过通用的组件接口与其子项目交互。容器接收到请求后会将工作分配给自己的子项目,处理中间结果,然后将最终结果返回给客户端。
    4. 客户端(Client)通过组件接口与所有项目交互。因此,客户端能以相同方式与树状结构中的简单或复杂项目交互。

    三、伪代码

    1. #!/usr/bin/env python
    2. # -*- coding: UTF-8 -*-
    3. __doc__ = """
    4. 组合模式
    5. 例:生成具有树状结构的食品分类,并遍历输出
    6. """
    7. from abc import ABC, abstractmethod
    8. class Component(ABC):
    9. """抽象基类"""
    10. @abstractmethod
    11. def operation(self):
    12. pass
    13. class Leaf(Component):
    14. """叶子节点类"""
    15. def __init__(self, name):
    16. self.name = name
    17. def operation(self, indent=""):
    18. return f"{indent}- {self.name}"
    19. class Composite(Component):
    20. """容器节点类"""
    21. def __init__(self, name):
    22. self.name = name
    23. self.children = []
    24. def add(self, component):
    25. self.children.append(component)
    26. def remove(self, component):
    27. self.children.remove(component)
    28. def operation(self, indent=""):
    29. result = [f"{indent}+ {self.name}"]
    30. for child in self.children:
    31. result.append(child.operation(indent + " "))
    32. return "\n".join(result)
    33. if __name__ == "__main__":
    34. """
    35. + 食品
    36. + 水果
    37. - 苹果
    38. - 香蕉
    39. + 蔬菜
    40. - 西红柿
    41. - 黄瓜
    42. """
    43. fruit = Composite("水果")
    44. fruit.add(Leaf("苹果"))
    45. fruit.add(Leaf("香蕉"))
    46. vegetable = Composite("蔬菜")
    47. vegetable.add(Leaf("西红柿"))
    48. vegetable.add(Leaf("黄瓜"))
    49. food = Composite("食品")
    50. food.add(fruit)
    51. food.add(vegetable)
    52. print(food.operation())

    四、优缺点

    优点

    • 开闭原则。 无需更改现有代码, 你就可以在应用中添加新元素, 使其成为对象树的一部分。

    缺点

    • 对于功能差异较大的类,提供公共接口或许会有困难。在特定情况下,你需要过度一般化组件接口,使其变得令人难以理解。

     跳转主页:【Python笔记】设计模式-CSDN博客

  • 相关阅读:
    GeoScene Pro 2.1下载地址与安装基本要求
    bert----学习笔记
    MySQL数据库
    Hive中的数据倾斜优化
    docker内更新显卡cuda cudnn
    Linux篇18多线程第二部分
    【SpringCloud-Seata分布式事物】
    Java ArrayList 与 LinkedList 的灵活选择
    瞬态抑制二极管TVS的核心参数?|深圳比创达电子EMC(下)
    kubernetes 安装与部署
  • 原文地址:https://blog.csdn.net/weixin_44904331/article/details/136211860