组合模式
概述
- 将对象组合成树形结构以表示“部分和整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性
对象
- 抽象组件(Component)
- 叶子组件(Leaf)
- 复合组件(Composite)
- 客户端(Client)
适用场景
- 表示对象的“部分与整体”层次结构
- 希望用户忽略组合对象与单个对象的不同,用户统一的使用组合结构中的所有对象
例子
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 f"Point({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 f"Line[{self.p1}, {self.p2}]"
def draw(self):
print(str(self))
class Picture(Graphic):
def __init__(self, iterable):
self.children = []
for i in iterable:
self.add(i)
def add(self, grophic):
self.children.append(grophic)
def draw(self):
print("---复合图形---")
for i in self.children:
i.draw()
print("---复合图形---")
print("-----------pic1-------------------")
p1 = Point(2,3)
l1 = Line(Point(3,4), Point(6,7))
l2 = Line(Point(3,5), Point(6,8))
pic1 = Picture([p1, l1, l2])
pic1.draw()
print("-----------pic2-------------------")
p2 = Point(3,3)
l3 = Line(Point(4,4), Point(7,7))
l4 = Line(Point(5,5), Point(8,8))
pic2 = Picture([p2, l3, l4])
pic2.draw()
print("-----------pic-------------------")
pic = Picture([pic1, pic2])
pic.draw()
优点
- 定义了包含基本对象和组合对象的层次结构
- 简化了客户端代码,客户端可以一致的使用组合对象和单个对象
- 更容易增加新类型组件