Middle
Was ist ein Decorator im Kontext der Programmierung und wie wird er verwendet?
sobes.tech KI
Antwort von AI
Der Dekorateur ist ein strukturelles Entwurfsmuster, das es ermöglicht, einem Objekt dynamisch neues Verhalten oder Verantwortlichkeiten hinzuzufügen, ohne seine Struktur zu modifizieren.
Hauptideen:
- Umhüllt ein bestehendes Objekt und erweitert dessen Funktionalität.
- Bewahrt die Schnittstelle des umhüllten Objekts und sorgt für Austauschbarkeit.
- Vermeidet das Wachstum von Klassenhierarchien bei Hinzufügung neuer Verhaltenskombinationen.
Verwendung:
- Erweiterung der Funktionalität "zur Laufzeit": Wird angewendet, wenn das Verhalten eines Objekts während der Programmausführung hinzugefügt oder geändert werden soll.
- Alternative zur Vererbung: Anstatt Unterklassen für jede Verhaltenskombination zu erstellen, werden Dekorateure verwendet. Dies ist ein flexiblerer Ansatz.
- Kombination von Verhaltensweisen: Verschiedene Dekorateure können in unterschiedlicher Reihenfolge auf dasselbe Objekt angewendet werden, um einzigartige Kombinationen zu erstellen.
Beispiel in Python:
# Basiskomponente
class Component:
def operation(self):
pass
# Konkrete Komponente
class ConcreteComponent(Component):
def operation(self):
return "ConcreteComponent"
# Basiskomponente (Decorator), speichert eine Referenz auf das umhüllte Objekt
class Decorator(Component):
def __init__(self, component):
self._component = component
def operation(self):
return self._component.operation()
# Konkreter Dekorateur A
class ConcreteDecoratorA(Decorator):
def operation(self):
return f"ConcreteDecoratorA({self._component.operation()})"
# Konkreter Dekorateur B
class ConcreteDecoratorB(Decorator):
def operation(self):
return f"ConcreteDecoratorB({self._component.operation()})"
# Verwendung
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))
Beispiel in Python als syntaktischer Zucker @:
def my_decorator(func):
def wrapper():
print("Vor der Funktion")
func()
print("Nach der Funktion")
return wrapper
@my_decorator
def say_hello():
print("Hallo!")
say_hello()
# Ausgabe:
# Vor der Funktion
# Hallo!
# Nach der Funktion