当前位置:   article > 正文

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

【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博客

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/146405
推荐阅读
相关标签
  

闽ICP备14008679号