Middle
Čo je dekorátor (Decorator) v kontexte programovania a ako sa používa?
sobes.tech AI
Odpoveď od AI
Dekorátor je štrukturálny návrhový vzor, ktorý umožňuje dynamicky pridávať nové správanie alebo povinnosti objektom bez modifikácie ich štruktúry.
Hlavné myšlienky:
- Obalí existujúci objekt, rozširujúc jeho funkčnosť.
- Zachováva rozhranie obalovaného objektu, zabezpečujúc výmenu.
- Vyhýba sa rastu hierarchie tried pri pridávaní nových kombinácií správania.
Použitie:
- Rozšírenie funkčnosti "za behu": Používa sa, keď je potrebné pridať alebo zmeniť správanie objektu počas behu programu.
- Alternatíva dedičnosti: Namiesto vytvárania podtried pre každú kombináciu správania sa používajú dekorátory. Je to flexibilnejší prístup.
- Kombinovanie správaní: Rôzne dekorátory môžu byť aplikované na ten istý objekt v rôznom poradí, čím vznikajú jedinečné kombinácie.
Príklad v Pythone:
# Základný komponent
class Component:
def operation(self):
pass
# Konkrétny komponent
class ConcreteComponent(Component):
def operation(self):
return "ConcreteComponent"
# Základný dekorátor (uchováva odkaz na obalovaný objekt)
class Decorator(Component):
def __init__(self, component):
self._component = component
def operation(self):
return self._component.operation()
# Konkrétny dekorátor A
class ConcreteDecoratorA(Decorator):
def operation(self):
return f"ConcreteDecoratorA({self._component.operation()})"
# Konkrétny dekorátor B
class ConcreteDecoratorB(Decorator):
def operation(self):
return f"ConcreteDecoratorB({self._component.operation()})"
# Použitie
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))
Príklad v Pythone ako syntaktický cukor @:
def my_decorator(func):
def wrapper():
print("Pred funkciou")
func()
print("Po funkcii")
return wrapper
@my_decorator
def say_hello():
print("Ahoj!")
say_hello()
# Výstup:
# Pred funkciou
# Ahoj!
# Po funkcii