Middle
Wat is een decorator (Decorator) in de context van programmeren en hoe wordt het gebruikt?
sobes.tech AI
Antwoord van AI
De decorator is een structureel ontwerppatroon dat het mogelijk maakt om dynamisch nieuw gedrag of verantwoordelijkheden aan objecten toe te voegen zonder hun structuur te wijzigen.
Belangrijkste ideeën:
- Omhult een bestaand object en breidt de functionaliteit uit.
- Behoudt de interface van het omhulde object, waardoor uitwisselbaarheid wordt gegarandeerd.
- Vermijdt de proliferatie van klassendiagrammen bij het toevoegen van nieuwe gedragcombinaties.
Gebruik:
- Uitbreiding van functionaliteit "ter plekke": Wordt toegepast wanneer je gedrag van een object tijdens de uitvoering van het programma wilt toevoegen of wijzigen.
- Alternatief voor erfelijkheid: In plaats van subklassen te maken voor elke gedragcombinatie, worden decorateurs gebruikt. Dit is een flexibelere aanpak.
- Combinatie van gedragingen: Verschillende decorateurs kunnen in verschillende volgordes op hetzelfde object worden toegepast, waardoor unieke combinaties ontstaan.
Voorbeeld in Python:
# Basiselement
class Component:
def operation(self):
pass
# Concrete component
class ConcreteComponent(Component):
def operation(self):
return "ConcreteComponent"
# Basis decorateur (houdt een verwijzing naar het omhulde object)
class Decorator(Component):
def __init__(self, component):
self._component = component
def operation(self):
return self._component.operation()
# Concrete decorateur A
class ConcreteDecoratorA(Decorator):
def operation(self):
return f"ConcreteDecoratorA({self._component.operation()})"
# Concrete decorateur B
class ConcreteDecoratorB(Decorator):
def operation(self):
return f"ConcreteDecoratorB({self._component.operation()})"
# Gebruik
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))
Voorbeeld in Python als syntactisch suiker @:
def my_decorator(func):
def wrapper():
print("Voor de functie")
func()
print("Na de functie")
return wrapper
@my_decorator
def say_hello():
print("Hallo!")
say_hello()
# Uitvoer:
# Voor de functie
# Hallo!
# Na de functie