组合模式的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类图展示了如何通过抽象组件、叶子节点和组合节点来构建树形结构。这种模式使得客户端可以一致地处理单个对象和组合对象,简化了客户端代码,并提供了灵活的结构。
