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

  1. "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.
  2. 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.
  3. 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