组合模式(Composite Pattern)
一、概念
组合模式(Composite Pattern)也称之为整体-部分(Part-Whole)模式。核心是通过将单个对象(叶子节点)和组合对象(树枝节点)用相同的接口进行表示
,组合成树形结构
,使得单个对象(即叶子对象)
和组合对象(即容器对象)
的使用具有一致性。
- 它将对象以
树形结构
表示,最顶层
的节点称为根节点
,根节点下面可以包含树枝节点
和叶子节点
,树枝节点下面又可以包含树枝节点和叶子节点
(一)组合和聚合概念简单理解
- 聚合:就是说各个对象聚合在一起工作,但是我没有你也行,我照样可以正常运行。
- 组合呢,关系就比较密切,组合中的各个对象之间组成了一个整体,缺少了某一个对象就不能正常运行或者说功能会有很大缺陷。
- 也就是说
聚合对象 "不具备相同生命周期",而组合对象 "具有相同的生命周期"
二、适用场景
组合模式一般应用在有层级关系的场景,最经典的就是树形菜单,文件和文件夹的管理等
三、参与者
-
抽象根节点/ 抽象构建(Component):定义了树叶节点和树枝节点的
公有属性和方法
,可预先定义一些默认行为(方法)和属性
。 - 树枝节点/容器节点(Composite):定义树枝节点的行为(方法),存储子节点,组合树枝节点和叶子节点形成一个树形结构。
-
树叶节点(Leaf):是树级结构中的中的
最小单位
,下面没有子节点
。 - 用户Client
四、代码例子
一个大公司由两个部门组成,分别是研发部门和市场部门,研发部门又由C++开发、Java开发、测试开发组成,市场部门由销售员工、服务员工组成
-
抽象根节点/ 抽象构建(Component):Component
- 树枝节点/容器节点(Composite):Organization
-
树叶节点(Leaf):ResearchIndividual、MarketIndividual
五、UML图
六、模式动机
- 组合模式的关键是定义了一个
抽象类
,既可以代表叶子,又可以代表容器
,而对于调用端来说针对该抽象类进行编程,无须知道它到底表示的是叶子还是容器,可以对其进行统一处理。
- 容器对象与抽象类之间还建立一个
聚合关联
关系,在容器对象中既可以包含叶子,也可以包含容器
,以此实现递归组合,形成一个树形结构。
七、优缺点
(一)优点
- 定义了一个
抽象类
,既可以代表叶子,又可以代表容器
,而对于调用端来说针对该抽象类进行编程,无须知道它到底表示的是叶子还是容器,可以对其进行统一处理。 - 定义了包含
叶子对象
和容器对象
的类层次结构,叶子对象可以被组合成更复杂的容器对象,而这个容器对象又可以被组合,这样不断递归
下去,可以形成复杂的树形结构。
(二)缺点
- 其叶子和树枝的声明是
实现类
而不是接口,违反了依赖倒置原则,而且组合模式会使设计更加抽象不好理解。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了