Middle
Šta je dekorator (Decorator) u kontekstu programiranja i kako se koristi?
sobes.tech АИ
Одговор од АИ
Декоратор је структурни образац дизајна који омогућава динамичко додавање новог понашања или одговорности објектима без измене њихове структуре.
Главне идеје:
- Обавија постојећи објекат и проширује његову функционалност.
- Чува интерфејс објекта који се обавија, обезбеђујући заменљивост.
- Избегава раст класа при додавању нових комбинација понашања.
Користи се:
- Проширење функционалности "у току рада": Када је потребно додати или променити понашање објекта током извршавања програма.
- Альтернатива наслеђивању: Уместо стварања подкласа за сваки скуп понашања, користе се декоратори. Ово је флексибилнији приступ.
- Комбиновање понашања: Различити декоратори могу бити примењени на исти објекат у различитим редоследима, стварајући јединствене комбинације.
Пример у 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()
# Конкретни декоратор А
class ConcreteDecoratorA(Decorator):
def operation(self):
return f"ConcreteDecoratorA({self._component.operation()})"
# Конкретни декоратор Б
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()
# Излаз:
# Пре функције
# Здраво!
# После функције