Ответ
Декоратор — это структурный паттерн проектирования, который позволяет динамически добавлять объектам новую функциональность, оборачивая их в специальные классы-обертки.
Основная идея — расширение поведения объекта без создания подклассов. Это соответствует принципу открытости/закрытости (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.