这是我参与11月更文挑战的第14天,活动详情查看:2021最后一次更文挑战
概述
组合模式(Composite Pattern)将多个对象用树形结构表示,形成“整体—部分”的层次结构,因此又被称为整体—部分(Part-Whole)模式,它是一种对象结构型模式。
组合模式的关键是定义一个抽象构件类,使它既可以代表叶子,又可以代表容器,而客户端针对该抽象构件类进行编程,无须知道它表示的到底是叶子还是容器,可以对其进行统一处理。例如:张三开了一家水壶制造厂,有大、中、小三种型号的水壶,这些水壶都需要打磨,张三只需要对制造厂下令进行打磨就可以了,而不需要知道每种水壶具体是如何打磨的。制造厂就是抽象构件,水壶就是容器构件,具体型号的水壶就是叶子构件。
结构
- Component(抽象构件):一般是接口或抽象类,它包含所有子类共有行为的声明和实现。
- Leaf(叶子构件):没有子节点,实现了在抽象构件中定义的行为。
- Composite(容器构件):容器构件包含子节点,其子节点可以是叶子节点,也可以是容器节点。它通过集合来存储子节点,实现了在抽象构件中定义的行为,在其业务方法中可以递归调用其子节点的业务方法。
优点
- 高层模块调用简单,他不必关心自己处理的是单个对象还是整个组合结构。
- 节点可自由增加,符合开闭原则,容易扩展。
缺点
客户端调用的是容器构件,而它是实现类,不符合依赖倒置原则。
应用场景
- 维护和展示部分—整体关系的场景,如树形菜单,文件和文件夹管理等。
- 可以从整体中独立出部分模块或功能的场景。
JDK 中的应用
在 JDK 中 java.util.HashMap 使用了组合模式。java.util.Map 是抽象构件;java.util.HashMap 是容器构件;java.util.Node 是叶子构件。