在软件开发中,Composite(组合)设计模式是一种结构型模式,它允许你将对象组合成树形结构来表示“部分-整体”的层次结构。它使得客户端可以以一致的方式对待单个对象和组合对象,从而实现了对树状结构的透明操作。
何时使用 Composite 模式
- 需要表示对象的树形结构。
- 希望客户端可以一致地对待单个对象和对象的组合。
Composite 模式结构图
+------------------+ +-------------------+
| Graphic |<>------| CompositeGraphic|
+------------------+ +-------------------+
^ ^
| |
+------------------+ +------------------+
| Circle | | Rectangle |
+------------------+ +------------------+
核心组成部分
- Component(组件):定义了叶子和组合对象的公共接口。
- Leaf(叶子节点):表示树的叶子节点,不包含子节点。
- Composite(组合对象):表示有子节点的节点,并实现对其子节点的操作。
Python 实现示例
from abc import ABC, abstractmethod
# Component 接口
class Graphic(ABC):
@abstractmethod
def render(self):
pass
# Leaf 节点
class Circle(Graphic):
def render(self):
print("Rendering a Circle")
class Rectangle(Graphic):
def render(self):
print("Rendering a Rectangle")
# Composite 节点
class CompositeGraphic(Graphic):
def __init__(self):
self._children = []
def add(self, graphic):
self._children.append(graphic)
def remove(self, graphic):
self._children.remove(graphic)
def render(self):
print("Rendering a Composite Graphic")
for child in self._children:
child.render()
# 客户端代码
circle1 = Circle()
circle2 = Circle()
rectangle = Rectangle()
composite = CompositeGraphic()
composite.add(circle1)
composite.add(rectangle)
nested_composite = CompositeGraphic()
nested_composite.add(circle2)
nested_composite.add(composite)
nested_composite.render()
代码解释
Graphic
是抽象基类,定义了公共接口render()
。Circle
和Rectangle
是叶子节点,具体实现了render()
。CompositeGraphic
是组合节点,可以包含子节点并递归调用render()
,实现树形结构。
输出
Rendering a Composite Graphic
Rendering a Circle
Rendering a Rectangle
Rendering a Composite Graphic
Rendering a Circle
Rendering a Rectangle
优点
- 简化了客户端代码,客户端无需关心是处理单个对象还是组合对象。
- 提高了系统的可扩展性,可以轻松添加新的叶子或组合对象。
缺点
- 如果设计不当,可能会导致系统复杂化。
- 叶子和组合对象的行为可能存在差异,实现一致性需要额外注意。
Composite 模式非常适合需要以层次结构组织数据的场景,例如图形编辑器、文件系统等。