В чем заключается суть паттерна проектирования Декоратор

Ответ

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

Основная идея — следование принципу открытости/закрытости: можно расширять поведение объекта, не изменяя его исходный код.

Как это работает

  1. Создается интерфейс, общий для «декорируемого» объекта и «декоратора».
  2. Класс-декоратор содержит ссылку на декорируемый объект.
  3. Декоратор выполняет свою дополнительную логику до или после вызова метода оригинального объекта.

Пример в Python

В Python идея декоратора элегантно реализуется через синтаксис @, который чаще всего применяется к функциям.

import functools
import time

# Декоратор для измерения времени выполнения функции
def timer(func):
    @functools.wraps(func)  # Сохраняет метаданные (имя, docstring) исходной функции
    def wrapper(*args, **kwargs):
        start_time = time.perf_counter()
        result = func(*args, **kwargs)
        end_time = time.perf_counter()
        run_time = end_time - start_time
        print(f"Функция '{func.__name__}' выполнилась за {run_time:.4f} с")
        return result
    return wrapper

@timer
def process_data(data):
    """Имитирует долгую обработку данных."""
    time.sleep(1)
    return f"Обработано {len(data)} элементов"

print(process_data([1, 2, 3]))
# Вывод:
# Функция 'process_data' выполнилась за 1.0012 с
# Обработано 3 элементов

Основные преимущества

  • Гибкость: Функциональность можно добавлять и убирать во время выполнения.
  • Компонуемость: Декораторы можно применять цепочкой, комбинируя их поведение.
  • Избегание наследования: Позволяет избежать создания множества подклассов для каждой комбинации поведений.