组合模式的UML类图表示如下:
+------------------+ +------------------+
| Component | <----- | Leaf |
+------------------+ +------------------+
| + operation() | | + operation() |
+------------------+ +------------------+
^
|
|
+------------------+ +------------------+
| Composite | <----- | Leaf |
+------------------+ +------------------+
| - components[] | | + operation() |
| + add(c: Component) | +------------------+
| + remove(c: Component)|
| + operation() |
+------------------+
各个参与者及其职责:
-
Component(抽象组件):
- 职责:
- 定义组合对象的公共接口,所有子类都实现这个接口。
- 声明管理子组件的方法(如
add()
,remove()
),但不一定需要实现这些方法。
- 方法:
operation()
: 定义组合对象和叶子对象的公共操作接口。
- 职责:
-
Leaf(叶子节点):
- 职责:
- 表示组合中的叶子对象,叶子节点没有子节点。
- 实现
Component
接口中的操作方法。
- 方法:
operation()
: 实现具体的操作逻辑。
- 职责:
-
Composite(组合节点):
- 职责:
- 表示组合中的非叶子节点,可以包含子节点。
- 实现
Component
接口中的操作方法,并负责管理子组件。
- 方法:
add(Component)
: 添加子组件。remove(Component)
: 移除子组件。operation()
: 在组合节点上调用operation()
方法时,会递归调用所有子组件的operation()
方法。
- 职责:
示例说明:
假设你正在设计一个图形编辑器,其中包含各种形状(如矩形、圆形等),这些形状可以组合成更复杂的图形。
- Component:定义了所有图形对象的公共接口
operation()
,表示如何绘制图形。 - Leaf:表示单个形状(如矩形、圆形),直接实现
operation()
方法来绘制自身。 - Composite:表示包含其他形状的复杂图形,实现
operation()
方法时,会递归调用所有子形状的operation()
方法来绘制整个图形。
通过这种设计,客户端代码可以统一地处理单个形状和复杂图形,无需关心它们的具体类型,从而简化了客户端代码。
总结:
组合模式的UML类图展示了如何通过抽象组件、叶子节点和组合节点来构建树形结构。这种模式使得客户端可以一致地处理单个对象和组合对象,简化了客户端代码,并提供了灵活的结构。