Middle
Mi az a dekorátor (Decorator) a programozás kontextusában, és hogyan használják?
sobes.tech MI
Válasz az MI-től
A dekorátor egy strukturális tervezési minta, amely lehetővé teszi, hogy dinamikusan új viselkedést vagy felelősségeket adjunk hozzá objektumokhoz anélkül, hogy módosítanánk azok szerkezetét.
Fő ötletek:
- Egy meglévő objektumot körülvesz, kibővítve funkcionalitását.
- Megőrzi a becsomagolt objektum interfészét, biztosítva a csereszabatosságot.
- Elkerüli az osztályhierarchiák növekedését, amikor új viselkedéskombinációkat adunk hozzá.
Használat:
- "Futás közbeni" funkcionalitás bővítése: Akkor alkalmazzuk, amikor az objektum viselkedését a program futása közben kell hozzáadni vagy módosítani.
- Alternatíva az öröklésre: Minden viselkedéskombinációhoz alosztályokat hozunk létre, helyette dekorátorokat használunk. Ez egy rugalmasabb megközelítés.
- Viselkedések kombinálása: Különböző dekorátorokat alkalmazhatunk ugyanarra az objektumra különböző sorrendben, egyedi kombinációkat létrehozva.
Python példával:
# Alap komponens
class Component:
def operation(self):
pass
# Konkrét komponens
class ConcreteComponent(Component):
def operation(self):
return "ConcreteComponent"
# Alap dekorátor (referenciát tart a becsomagolt objektumra)
class Decorator(Component):
def __init__(self, component):
self._component = component
def operation(self):
return self._component.operation()
# Konkrét dekorátor A
class ConcreteDecoratorA(Decorator):
def operation(self):
return f"ConcreteDecoratorA({self._component.operation()})"
# Konkrét dekorátor B
class ConcreteDecoratorB(Decorator):
def operation(self):
return f"ConcreteDecoratorB({self._component.operation()})"
# Használat
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))
Pythonban szintaktikus cukorként az @ példával:
def my_decorator(func):
def wrapper():
print("Függvény előtt")
func()
print("Függvény után")
return wrapper
@my_decorator
def say_hello():
print("Helló!")
say_hello()
# Kimenet:
# Függvény előtt
# Helló!
# Függvény után