组合模式(Composite Pattern)

一、概念

组合模式(Composite Pattern)也称之为整体-部分(Part-Whole)模式。核心是通过将单个对象(叶子节点)和组合对象(树枝节点)用相同的接口进行表示,组合成树形结构,使得单个对象(即叶子对象)组合对象(即容器对象)的使用具有一致性。

  • 它将对象以树形结构表示,最顶层的节点称为根节点,根节点下面可以包含树枝节点叶子节点树枝节点下面又可以包含树枝节点和叶子节点

(一)组合和聚合概念简单理解

  • 聚合:就是说各个对象聚合在一起工作,但是我没有你也行,我照样可以正常运行。
  • 组合呢,关系就比较密切,组合中的各个对象之间组成了一个整体,缺少了某一个对象就不能正常运行或者说功能会有很大缺陷。
  • 也就是说聚合对象 "不具备相同生命周期",而组合对象 "具有相同的生命周期"

二、适用场景

组合模式一般应用在有层级关系的场景,最经典的就是树形菜单,文件和文件夹的管理等

三、参与者

  • 抽象根节点/ 抽象构建(Component):定义了树叶节点和树枝节点的公有属性和方法,可预先定义一些默认行为(方法)和属性

  • 树枝节点/容器节点(Composite):定义树枝节点的行为(方法),存储子节点,组合树枝节点和叶子节点形成一个树形结构。
  • 树叶节点(Leaf):是树级结构中的中的最小单位下面没有子节点

  • 用户Client 

四、代码例子

 一个大公司由两个部门组成,分别是研发部门和市场部门,研发部门又由C++开发、Java开发、测试开发组成,市场部门由销售员工、服务员工组成

  • 抽象根节点/ 抽象构建(Component):Component

  • 树枝节点/容器节点(Composite):Organization
  • 树叶节点(Leaf):ResearchIndividual、MarketIndividual

五、UML图

六、模式动机

  • 组合模式的关键是定义了一个抽象类既可以代表叶子,又可以代表容器,而对于调用端来说针对该抽象类进行编程,无须知道它到底表示的是叶子还是容器,可以对其进行统一处理。
  • 容器对象与抽象类之间还建立一个聚合关联关系,在容器对象中既可以包含叶子,也可以包含容器以此实现递归组合,形成一个树形结构

七、优缺点

(一)优点

  • 定义了一个抽象类既可以代表叶子,又可以代表容器,而对于调用端来说针对该抽象类进行编程,无须知道它到底表示的是叶子还是容器,可以对其进行统一处理。
  • 定义了包含叶子对象容器对象的类层次结构,叶子对象可以被组合成更复杂的容器对象,而这个容器对象又可以被组合,这样不断递归下去,可以形成复杂的树形结构。

(二)缺点

  • 其叶子和树枝的声明是实现类而不是接口,违反了依赖倒置原则,而且组合模式会使设计更加抽象不好理解。
posted @ 2022-12-09 21:03  ImreW  阅读(7)  评论(0编辑  收藏  举报