定义
- 将对象组合成树形结构以表示“整体 – 部分”的层次结构关系。组合使得用户对单个对象和复合对象的使用具有一致性。
组合模式的模型抽象
代码框架
from abc import ABCMeta, abstractmethod
# 引入ABCMeta和abstractmethod来定义抽象类和抽象方法
class Component(metaclass=ABCMeta):
"""组件"""
def __init__(self, name):
self._name = name
def getName(self):
return self._name
# 判断是否为符合组件
def isComposite(self):
return False
# 组件和符合组件都实现了feature方法
@abstractmethod
def feature(self, indent):
# indent 仅用于内容输出时的缩进
pass
class Composite(Component):
"""复合组件"""
def __init__(self, name):
super().__init__(name)
self._components = []
def addComponent(self, component):
self._components.append(component)
def removeComponent(self, component):
self._components.remove(component)
def isComposite(self):
return True
def feature(self, indent):
indent += "\t"
for component in self._components:
print(indent, end="")
component.feature(indent)
类图
模型说明
- 设计要点
- 理清部分与整体的关系,了解对象的组成结构。
- 组合模式是一种具有层次关系的树形结构,不能再分的叶子节点是具体的组件,也就是最小的逻辑单元;具有子节点(由多个子组件组成)的组件称为复合组件,也就是组合对象。
- 优缺点
- 优点:
- 调用简单,组合对象可以像一般对象一样使用。
- 组合对象可以自由地增加、删除组件,可灵活地组合不同的对象。
- 缺点:
- 在一些层次结构太深的场景中,组合结构会变得太庞杂。
应用场景
- 对象之间具有明显的“部分 – 整体”的关系时,或者具有层次关系时。
- 组合对象与单个对象具有相同或类似行为(方法),用户希望统一地使用组合结构中的所有对象。