组合模式
-
内容
将对象组合成树状结构表示部分-整体的层次结构。组合模式使用户对单个对象和多个对象的使用具有一致性
-
角色
- 抽象组件
- 叶子组件
- 复合组件
- 客户段
-
使用场景
-
表示对象部分-整体的层次结构。(特别是结构是递归的)
-
希望用户忽略组合对象和单个对象的不同,用户统一使用组合结构中的所有对象
-
-
优点
- 定义了包含基本对象和组合对象的类层次结构
- 简化客户段代码,即客户段可以一致的使用组合对象和单个对象
- 更容易增加新类型组件
-
代码实例
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(str(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(str(self)) # 组合组件 class Picture(Graphic): def __init__(self, iterable): self.childern = [] for g in iterable: self.add(g) def add(self, graphic): self.childern.append(graphic) def draw(self): print('------------这个是复合图形---------------') for g in self.childern: g.draw() # 客户段 point = Point(1, 9) line1 = Line(Point(4, 4), Point(7, 8)) line2 = Line(Point(2, 6), Point(5,9)) picture = Picture([point, line1, line2]) picture.draw()