Bootstrap

C++设计模式之组合模式的基本结构

组合模式的UML类图表示如下:

+------------------+        +------------------+
|    Component     | <----- |      Leaf        |
+------------------+        +------------------+
| + operation()    |        | + operation()    |
+------------------+        +------------------+
        ^
        |
        |
+------------------+        +------------------+
|    Composite     | <----- |      Leaf        |
+------------------+        +------------------+
| - components[]   |        | + operation()    |
| + add(c: Component) |      +------------------+
| + remove(c: Component)|
| + operation()    |
+------------------+

各个参与者及其职责:

  1. Component(抽象组件)

    • 职责
      • 定义组合对象的公共接口,所有子类都实现这个接口。
      • 声明管理子组件的方法(如 add()remove()),但不一定需要实现这些方法。
    • 方法
      • operation(): 定义组合对象和叶子对象的公共操作接口。
  2. Leaf(叶子节点)

    • 职责
      • 表示组合中的叶子对象,叶子节点没有子节点。
      • 实现 Component 接口中的操作方法。
    • 方法
      • operation(): 实现具体的操作逻辑。
  3. Composite(组合节点)

    • 职责
      • 表示组合中的非叶子节点,可以包含子节点。
      • 实现 Component 接口中的操作方法,并负责管理子组件。
    • 方法
      • add(Component): 添加子组件。
      • remove(Component): 移除子组件。
      • operation(): 在组合节点上调用 operation() 方法时,会递归调用所有子组件的 operation() 方法。

示例说明:

假设你正在设计一个图形编辑器,其中包含各种形状(如矩形、圆形等),这些形状可以组合成更复杂的图形。

  • Component:定义了所有图形对象的公共接口 operation(),表示如何绘制图形。
  • Leaf:表示单个形状(如矩形、圆形),直接实现 operation() 方法来绘制自身。
  • Composite:表示包含其他形状的复杂图形,实现 operation() 方法时,会递归调用所有子形状的 operation() 方法来绘制整个图形。

通过这种设计,客户端代码可以统一地处理单个形状和复杂图形,无需关心它们的具体类型,从而简化了客户端代码。

总结:

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

;