Что такое паттерн Декоратор и к какому типу он относится

«Что такое паттерн Декоратор и к какому типу он относится» — вопрос из категории Паттерны, который задают на 10% собеседований Python Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Декоратор — это структурный паттерн проектирования, который позволяет динамически добавлять объектам новую функциональность, оборачивая их в специальные классы-обертки.

Основная идея — расширение поведения объекта без создания подклассов. Это соответствует принципу открытости/закрытости (Open/Closed Principle).

Ключевые преимущества:

  • Гибкость: Новые обязанности можно добавлять и удалять во время выполнения программы.
  • Избегание наследования: Позволяет избежать разрастания иерархии классов.

Пример на Python:

# Базовый компонент
class TextComponent:
    def render(self) -> str:
        return "Hello, World!"

# Базовый декоратор
class BaseDecorator(TextComponent):
    def __init__(self, component: TextComponent):
        self._component = component

    def render(self) -> str:
        return self._component.render()

# Конкретные декораторы
class BoldDecorator(BaseDecorator):
    def render(self) -> str:
        return f"<b>{super().render()}</b>"

class ItalicDecorator(BaseDecorator):
    def render(self) -> str:
        return f"<i>{super().render()}</i>"

# Использование
plain_text = TextComponent()
print(f"Обычный текст: {plain_text.render()}")

bold_text = BoldDecorator(plain_text)
print(f"Жирный текст: {bold_text.render()}")

italic_bold_text = ItalicDecorator(bold_text)
print(f"Жирный и курсивный текст: {italic_bold_text.render()}")

# Вывод:
# Обычный текст: Hello, World!
# Жирный текст: <b>Hello, World!</b>
# Жирный и курсивный текст: <i><b>Hello, World!</b></i>

В этом примере BoldDecorator и ItalicDecorator добавляют HTML-теги к исходному тексту, не изменяя класс TextComponent.