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í:
- 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.
- 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.
- 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