Sobes.tech
Middle
91
questionbank

Что такое декоратор (Decorator)?

Ответ от нейросети

sobes.tech AI

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

Основные элементы:

  • Компонент (Component): Интерфейс или абстрактный класс, определяющий общую функциональность для оборачиваемых объектов и декораторов.
  • Конкретный компонент (Concrete Component): Реализация компонента, базовый объект, к которому добавляется функциональность.
  • Декоратор (Decorator): Абстрактный класс, реализующий интерфейс Компонента и содержащий ссылку на объект Компонента.
  • Конкретный декоратор (Concrete Decorator): Реализация Декоратора, добавляющая специфическую функциональность перед или после вызова метода оборачиваемого объекта.

Пример на Python:

# Component
class Coffee:
    def get_cost(self):
        return 5 # Базовая стоимость кофе
    
    def get_description(self):
        return "Simple Coffee"

# Concrete Component
class SimpleCoffee(Coffee):
    pass

# Decorator
class CoffeeDecorator(Coffee):
    def __init__(self, coffee):
        self._coffee = coffee

    def get_cost(self):
        return self._coffee.get_cost()

    def get_description(self):
        return self._coffee.get_description()

# Concrete Decorator
class MilkDecorator(CoffeeDecorator):
    def get_cost(self):
        return self._coffee.get_cost() + 2 # Добавляем стоимость молока

    def get_description(self):
        return self._coffee.get_description() + ", Milk"

# Использование
# simple_coffee = SimpleCoffee()
# print(f"Cost: {simple_coffee.get_cost()}, Description: {simple_coffee.get_description()}")

# coffee_with_milk = MilkDecorator(simple_coffee)
# print(f"Cost: {coffee_with_milk.get_cost()}, Description: {coffee_with_milk.get_description()}")

Преимущества:

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

Недостатки:

  • Может увеличить количество классов.
  • Отладка может стать сложнее из-за цепочки оберток.