Middle
Какво е декоратор (Decorator)?
sobes.tech AI
Отговор от AI
Декораторът е структурен шаблон за дизайн, който позволява динамично добавяне на нови функционалности към обект, без да променя неговата структура. Той обвива обекта, предоставяйки същия интерфейс като обекта, който обвива, като същевременно добавя или променя неговото поведение.
Основни елементи:
- Компонент (Component): Интерфейс или абстрактен клас, който дефинира общата функционалност за обвиващите обекти и декораторите.
- Конкретен компонент (Concrete Component): Реализация на компонента, базовият обект, към който се добавя функционалност.
- Декоратор (Decorator): Абстрактен клас, който реализира интерфейса на компонента и съдържа препратка към обект компонент.
- Конкретен декоратор (Concrete Decorator): Реализация на декоратора, който добавя специфична функционалност преди или след извикването на метода на обвивания обект.
Пример на Python:
# Компонент
class Coffee:
def get_cost(self):
return 5 # Основна цена на кафето
def get_description(self):
return "Просто кафе"
# Конкретен компонент
class SimpleCoffee(Coffee):
pass
# Декоратор
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()
# Конкретен декоратор
class MilkDecorator(CoffeeDecorator):
def get_cost(self):
return self._coffee.get_cost() + 2 # Добавя цената на млякото
def get_description(self):
return self._coffee.get_description() + ", Мляко"
# Използване
# simple_coffee = SimpleCoffee()
# print(f"Цена: {simple_coffee.get_cost()}, Описание: {simple_coffee.get_description()}")
# кафе с мляко = MilkDecorator(simple_coffee)
# print(f"Цена: {кафе с мляко.get_cost()}, Описание: {кафе с мляко.get_description()}")
Предимства:
- Гъвкавост: Функционалността може да бъде добавена по време на изпълнение.
- Избягване на подкласове: Позволява да се избегне създаването на множество подкласове за всяка комбинация от поведения.
- Разделяне на отговорностите: Всяко добавяне на поведение се реализира в отделен клас.
Недостатъци:
- Може да увеличи броя на класовете.
- Отстраняването на грешки може да стане по-трудно поради веригата от обвивания.