1.定义
将对象组合成树形结构以表示“部分-整体”的层次结构(特别是结构是递归的)。
组合模式使得用户对单个对象和组合对象的使用具有一致性。
优点:
定义了包含基本对象和组合对象的层次结构;
简化客户端代码,客户端可以一致地使用组合对象和单个对象;
更加容易增加新类型的组件。
举例:
单个形状可成组,得到:
对大哥形状可以进行放大、缩小、变换颜色、样式等,而对成组形状也可进行放大、缩小、变换颜色、样式等。对单个形状和组合形状的操作具有一致性。
2.实现
from abc import ABCMeta, abstractmethod
# 抽象组件
class Graphic(metaclass=ABCMeta):
@abstractmethod
def draw(self):
pass
# 叶子组件
class Point(Graphic):
def __init__(self, x, y):
self.x = x
self.y = y
def __str__(self):
return '点(%s,%s)' % (self.x, self.y)
def draw(self):
print(self)
# 叶子组件
class Line(Graphic):
def __init__(self, p1, p2):
self.p1 = p1
self.p2 = p2
def __str__(self):
return '线段[(%s,%s)]' % (self.p1, self.p2)
def draw(self):
print(self)
# 复合组件
class Picture(Graphic):
def __init__(self, iterable):
self.children = []
for g in iterable:
self.add(g)
def add(self, graphic):
self.children.append(graphic)
def draw(self):
for g in self.children:
g.draw()
# 简单图形
print('------简单图形------')
p = Point(1, 2)
l1 = Line(Point(1, 2), Point(3, 4))
l2 = Line(Point(5, 6), Point(7, 8))
print(p)
print(l1)
print(l2)
print('------复合图形(p,l1,l2)------')
# 复合图形
pic = Picture([p, l1, l2])
pic.draw()
角色:
抽象组件:对组件的定义。
叶子组件:最小组件单元。
复合组件:由多个叶子组件构成,实现抽象组件中的方法。
高层代码client客户端。
3.小结
组合模式描述部分与整体之间的关系,部分和整体暴露给高层的是相同。对高层而言,对部分和整体的操作方法是相同的。