Middle
Какво е декоратор (Decorator) в контекста на програмирането и как се използва?
sobes.tech AI
Отговор от AI
Декораторът е структурен шаблон за дизайн, който позволява динамично добавяне на ново поведение или отговорности към обекти без да променя тяхната структура.
Основни идеи:
- Обгръща съществуващ обект и разширява неговата функционалност.
- Запазва интерфейса на обгръщания обект, осигурявайки взаимозаменяемост.
- Избягва разрастването на йерархията на класовете при добавяне на нови комбинации от поведение.
Използване:
- Разширяване на функционалността "на летящо": Използва се, когато е необходимо да се добави или промени поведението на обект по време на изпълнение на програмата.
- Алтернатива на наследяването: Вместо създаване на подкласове за всяка комбинация от поведение, се използват декоратори. Това е по-гъвкав подход.
- Комбиниране на поведения: Различни декоратори могат да бъдат приложени към един и същи обект в различен ред, създавайки уникални комбинации.
Пример на Python:
# Базов компонент
class Component:
def operation(self):
pass
# Конкретен компонент
class ConcreteComponent(Component):
def operation(self):
return "ConcreteComponent"
# Базов декоратор (запазва препратка към обекта, който обгръща)
class Decorator(Component):
def __init__(self, component):
self._component = component
def operation(self):
return self._component.operation()
# Конкретен декоратор A
class ConcreteDecoratorA(Decorator):
def operation(self):
return f"ConcreteDecoratorA({self._component.operation()})"
# Конкретен декоратор B
class ConcreteDecoratorB(Decorator):
def operation(self):
return f"ConcreteDecoratorB({self._component.operation()})"
# Използване
simple = ConcreteComponent()
print(simple.operation()) # ConcreteComponent
decorated_a = ConcreteDecoratorA(simple)
print(decorated_a.operation()) # ConcreteDecoratorA(ConcreteComponent)
decorated_b_a = ConcreteDecoratorB(decorated_a)
print(decorated_b_a.operation()) # ConcreteDecoratorB(ConcreteDecoratorA(ConcreteComponent))
Пример в Python като синтактичен захар @:
def my_decorator(func):
def wrapper():
print("Преди функцията")
func()
print("След функцията")
return wrapper
@my_decorator
def say_hello():
print("Здравей!")
say_hello()
# Изход:
# Преди функцията
# Здравей!
# След функцията