Sobes.tech
Middle

Co je to dekorátor (Decorator) v kontextu programování a jak se používá?

sobes.tech AI

Odpověď od AI

Dekorátor je strukturální návrhový vzor, který umožňuje dynamicky přidávat nové chování nebo odpovědnosti objektům bez změny jejich struktury.

Hlavní myšlenky:

  • Obaluje existující objekt a rozšiřuje jeho funkčnost.
  • Zachovává rozhraní obalovaného objektu, zajišťuje zaměnitelnost.
  • Vyhýbá se růstu hierarchie tříd při přidávání nových kombinací chování.

Použití:

  1. Rozšíření funkčnosti "za běhu": Používá se, když je třeba přidat nebo změnit chování objektu během běhu programu.
  2. Alternativa k dědičnosti: Místo vytváření podtříd pro každou kombinaci chování se používají dekorátory. Je to flexibilnější přístup.
  3. Kombinace chování: Různé dekorátory mohou být aplikovány na stejný objekt v různém pořadí, vytvářející unikátní kombinace.

Příklad v Pythonu:

# Základní komponenta
class Component:
    def operation(self):
        pass

# Konkrétní komponenta
class ConcreteComponent(Component):
    def operation(self):
        return "ConcreteComponent"

# Základní dekorátor (uchovává odkaz na obalovaný objekt)
class Decorator(Component):
    def __init__(self, component):
        self._component = component

    def operation(self):
        return self._component.operation()

# Konkrétní dekorátor A
class ConcreteDecoratorA(Decorator):
    def operation(self):
        return f"ConcreteDecoratorA({self._component.operation()})"

# Konkrétní dekorátor B
class ConcreteDecoratorB(Decorator):
    def operation(self):
        return f"ConcreteDecoratorB({self._component.operation()})"

# Použití
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))

Příklad v Pythonu jako syntaktický cukr @:

def my_decorator(func):
    def wrapper():
        print("Před funkcí")
        func()
        print("Po funkci")
    return wrapper

@my_decorator
def say_hello():
    print("Ahoj!")

say_hello()
# Výstup:
# Před funkcí
# Ahoj!
# Po funkci