手机网站建设南通网站建设

深圳市盛世开元企业管理咨询有限公司 2026/09/09 18:47:49

Python 中的组合模式(Composite Pattern)

组合模式是一种结构型设计模式,其核心目的是:
将对象组合成树形结构以表示“部分-整体”的层次结构,使得客户端对单个对象和组合对象的使用具有一致性

形象比喻:就像文件系统——文件夹(容器)可以包含文件(叶子)和子文件夹,而文件夹又可以嵌套文件夹。客户端可以统一对待文件和文件夹(例如统一遍历、计算大小)。

组合模式的优点
  • 定义了包含基本对象和组合对象的类层次结构
  • 简化客户端代码:客户端可以一致处理单个对象和组合对象
  • 更容易添加新类型的组件
  • 符合“开闭原则”:对扩展开放(新增组件类型)
典型应用场景
  • 文件系统(文件 + 目录)
  • GUI 组件树(窗口、面板、按钮、标签等)
  • 组织架构(公司、部门、员工)
  • 图形绘制(基本图形 + 图形组)
  • XML / HTML DOM 树
  • 菜单系统(菜单项 + 子菜单)
Python 实现示例:文件系统
fromabcimportABC,abstractmethodfromtypingimportList# 组件接口(Component)classFileSystemComponent(ABC):@abstractmethoddefget_name(self)->str:pass@abstractmethoddefget_size(self)->int:pass@abstractmethoddefdisplay(self,indent:str=""):pass# 叶子节点(Leaf):文件classFile(FileSystemComponent):def__init__(self,name:str,size:int):self.name=name self.size=sizedefget_name(self)->str:returnself.namedefget_size(self)->int:returnself.sizedefdisplay(self,indent:str=""):print(f"{indent}📄{self.name}({self.size}KB)")# 组合节点(Composite):目录classDirectory(FileSystemComponent):def__init__(self,name:str):self.name=name self.children:List[FileSystemComponent]=[]defget_name(self)->str:returnself.namedefadd(self,component:FileSystemComponent):self.children.append(component)defremove(self,component:FileSystemComponent):self.children.remove(component)defget_size(self)->int:# 递归计算总大小returnsum(child.get_size()forchildinself.children)defdisplay(self,indent:str=""):print(f"{indent}📁{self.name}({self.get_size()}KB)")forchildinself.children:child.display(indent+" ")# 客户端使用(统一对待文件和目录)if__name__=="__main__":# 创建文件file1=File("document.pdf",1024)file2=File("photo.jpg",2048)file3=File("script.py",256)# 创建目录src_dir=Directory("src")src_dir.add(File("main.py",512))src_dir.add(File("utils.py",128))docs_dir=Directory("docs")docs_dir.add(file1)docs_dir.add(file2)# 根目录root=Directory("MyProject")root.add(src_dir)root.add(docs_dir)root.add(file3)# 统一显示整个结构root.display()print("
总大小:",root.get_size(),"KB")

输出

📁 MyProject (6016 KB) 📁 src (640 KB) 📄 main.py (512 KB) 📄 utils.py (128 KB) 📁 docs (3072 KB) 📄 document.pdf (1024 KB) 📄 photo.jpg (2048 KB) 📄 script.py (256 KB) 总大小: 6016 KB

客户端代码完全不需要区分是文件还是目录,都调用相同的display()get_size()方法。

更实用的例子:GUI 组件树
classGraphic(ABC):@abstractmethoddefdraw(self):passclassDot(Graphic):def__init__(self,x,y):self.x,self.y=x,ydefdraw(self):print(f"绘制点 ({self.x},{self.y})")classCircle(Graphic):def__init__(self,x,y,radius):self.x,self.y,self.radius=x,y,radiusdefdraw(self):print(f"绘制圆 中心({self.x},{self.y}) 半径{self.radius}")classCompoundGraphic(Graphic):def__init__(self):self.children:List[Graphic]=[]defadd(self,child:Graphic):self.children.append(child)defremove(self,child:Graphic):self.children.remove(child)defdraw(self):print("绘制复合图形 {")forchildinself.children:child.draw()print("}")# 使用compound=CompoundGraphic()compound.add(Dot(10,20))compound.add(Circle(50,50,30))big_compound=CompoundGraphic()big_compound.add(compound)big_compound.add(Dot(100,100))big_compound.draw()
组合模式结构总结
角色说明
Component抽象组件(FileSystemComponent / Graphic)
Leaf叶子节点(File / Dot / Circle)
Composite组合节点(Directory / CompoundGraphic)
Client统一操作 Component 的客户端
组合模式 vs 其他模式对比
模式目的结构特点
组合部分-整体层次结构,一致处理树形结构
装饰器动态添加职责链式包装
享元共享大量细粒度对象共享叶子节点
访问者在组合结构上添加新操作双分派
Python 中的实用建议
  • Python 的动态特性让组合模式实现非常自然。
  • 常与迭代器模式结合使用(遍历树结构)。
  • 在实际项目中非常常见:
    • lxmlxml.etree.ElementTree的 XML 树
    • PyQt/Tkinter的控件树
    • 游戏引擎中的场景图(Scene Graph)
    • AST(抽象语法树)在编译器中
  • 注意安全问题:如果叶子节点实现了某些组合节点没有的方法,客户端需小心(可用NotImplementedError)。
注意事项
  • 组合模式会产生很多小对象(尤其是叶子多时),注意性能。
  • 如果树很深,递归操作可能导致栈溢出(可用迭代方式替代)。
  • 叶子和组合的接口要保持一致(至少在客户端关心的操作上)。

组合模式是处理树形结构最优雅的方式之一,尤其在需要递归处理层次结构时。

如果你想看更高级的例子(如带删除、搜索功能的菜单系统、组织架构权限控制、结合访问者模式的图形编辑器),欢迎继续问!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

行业网站建设高端品牌网站建设

HeyGem 数字人视频生成系统技术解析:AI驱动的批量口型同步视频合成在短视频与自动化内容爆发的时代,企业每天都在为如何高效生产高质量讲解视频而头疼。传统的拍摄剪辑流程不

2026/06/30 11:56:29

网站建设策划方案长沙网站建设

Windows 7磁盘管理全攻略:从创建到维护在Windows 7系统中,磁盘管理是一项重要的系统操作,它涵盖了创建和挂载虚拟硬盘、格式化卷、更改驱动器号和卷标、将卷转换为NTFS格式、删除卷、维护和

2026/06/30 10:06:48

广州市网站建设淮安网站建设

智能学习助手:解放双手的全自动网课解决方案【免费下载链接】hcqHome简单好用的刷课脚本[支持平台:职教云,智慧职教,资源库]项目地址: https://gitcode.com/gh_

2026/06/30 11:26:25

塘沽网站建设成都市网站建设

第一章:Open-AutoGLM电脑实战指南概述Open-AutoGLM 是一款基于开源大语言模型的自动化代码生成与智能推理工具,专为开发者和系统工程师设计,

2026/06/30 12:54:33

网站建设报价网站正在建设中

Nexus Mods App 3步快速入门:游戏插件管理从未如此简单【免费下载链接】NexusMods.AppHome of the development of the Nexus M

2026/06/30 12:34:32

大型门户网站建设益阳网站建设

——为什么很多父母在错误的阶段,用了错误的力?父子时光三部曲:拥抱、并肩与目送开场:那个深夜的“关门声”如果你家里有个男孩,你可能对这样的场景并不陌生:记得我大儿子十三岁那年,有天晚上我端着切好的水果

2026/06/30 10:35:51

苏州企业网站建设舟山网站建设

YOLO镜像支持GraphQL查询接口定制在智能制造车间的边缘服务器上,一台搭载YOLO模型的视觉检测节点正以每秒30帧的速度分析传送带上的产品缺陷。与此同时,三个不同的前

2026/06/30 13:20:05

律师网站建设四川建设厅网站

PyTorch安装后无法调用GPU?Miniconda-Python3.10排查步骤大全在深度学习项目中,你是否曾经历过这样的尴尬时刻:满怀期待地运行训练脚本

2026/06/30 14:01:38

网站建设步骤网站制作建设

从零实现高精度循迹:手把手教你用PID算法驯服Arduino小车你有没有试过让一台Arduino小车沿着黑线走?刚开始看起来挺简单——左边偏离就右转,右边偏离

2026/06/30 10:15:49

青岛网站建设宿迁网站建设

大模型推理服务降本增效:TensorRT实战案例在大模型落地生产环境的今天,一个现实问题正困扰着众多AI团队:明明训练效果惊艳,但一上线就“卡成

2026/06/30 10:02:48