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()}")
Преимущества:
- Гибкость: Функциональность добавляется во время выполнения.
- Избегание подклассов: Позволяет избежать создания множества подклассов для каждой комбинации поведения.
- Разделение ответственности: Каждое добавление поведения выносится в отдельный класс.
Недостатки:
- Может увеличить количество классов.
- Отладка может стать сложнее из-за цепочки оберток.