certain-design-patterns/composite.py

55 lines
1.6 KiB
Python
Raw Permalink Normal View History

2025-02-07 12:10:20 +03:00
class Component:
"""Абстрактный класс для всех компонентов."""
def operation(self):
raise NotImplementedError("Метод operation должен быть переопределен.")
class Leaf(Component):
"""Листовой элемент, который не имеет подкомпонентов."""
def __init__(self, name):
self.name = name
def operation(self):
return f"Leaf: {self.name}"
class Composite(Component):
"""Композитный элемент, который может содержать другие компоненты."""
def __init__(self, name):
self.name = name
self.children = []
def add(self, component):
self.children.append(component)
def remove(self, component):
self.children.remove(component)
def operation(self):
results = [f"Composite: {self.name}"]
for child in self.children:
results.append(child.operation())
return "\n".join(results)
# Пример использования
if __name__ == "__main__":
# Создаем листья
leaf1 = Leaf("Leaf 1")
leaf2 = Leaf("Leaf 2")
leaf3 = Leaf("Leaf 3")
# Создаем композиты
composite1 = Composite("Composite 1")
composite2 = Composite("Composite 2")
# Добавляем листья в композиты
composite1.add(leaf1)
composite1.add(leaf2)
composite2.add(leaf3)
composite2.add(composite1) # Вложение composite1 в composite2
# Выполняем операции
print(composite2.operation())