跳转至

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'点{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'线段 {self.p1} {self.p2}'

def draw(self):
    print(str(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):
    print(f'------- 复合图形 -------')
    for g in self.children:
        g.draw()
    print(f'------- 复合图形 -------')

p1 = Point(2, 3) l1 = Line(Point(3, 4), Point(6, 7)) l2 = Line(Point(1, 5), Point(2, 8)) pic1 = Picture([p1, l1, l2])

p2 = Point(4, 4) l3 = Line(Point(1, 1), Point(0, 0)) pic2 = Picture([p2, l3])

pic = Picture([pic1, pic2]) pic.draw()