Sobes.tech
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:

  1. Rozšírenie funkčnosti "za behu": Používa sa, keď je potrebné pridať alebo zmeniť správanie objektu počas behu programu.
  2. 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.
  3. 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