Middle
Wat is een decorator?
sobes.tech AI
Antwoord van AI
Een decorator is een structureel ontwerppatroon dat het mogelijk maakt om dynamisch nieuw gedrag toe te voegen aan objecten door ze te omhullen in speciale decorator-objecten.
Basisprincipes:
- Samenstelling in plaats van erfelijkheid. De decorator breidt de functionaliteit van het object uit zonder de klasse te wijzigen en zonder erfelijkheid te gebruiken.
- Flexibiliteit. Maakt het mogelijk om verantwoordelijkheden van het object toe te voegen of te verwijderen tijdens de uitvoering.
- Compatibiliteit. Decorators en de omhulde objecten hebben een gemeenschappelijke interface, waardoor ze uitwisselbaar zijn.
Structuur:
- Component (Component): Interface voor objecten waaraan dynamisch verantwoordelijkheden kunnen worden toegevoegd.
- Concrete component (ConcreteComponent): Implementatie van de component.
- Decorator (Decorator): Abstracte klasse of interface die de component uitbreidt en een verwijzing naar een componentobject bevat.
- Concrete decorators (Concrete Decorators): Implementaties van de decorator die specifieke gedragingen toevoegen.
Voorbeeld (Python):
// Interface van de component
class Coffee:
def get_cost(self):
pass
def get_description(self):
pass
// Concrete component
class SimpleCoffee(Coffee):
def get_cost(self):
return 1.0
def get_description(self):
return "Eenvoudige koffie"
// Basis decorator
class CoffeeDecorator(Coffee):
def __init__(self, decorated_coffee):
self._decorated_coffee = decorated_coffee
def get_cost(self):
return self._decorated_coffee.get_cost()
def get_description(self):
return self._decorated_coffee.get_description()
// Concrete decorator (Melk)
class MilkDecorator(CoffeeDecorator):
def get_cost(self):
return self._decorated_coffee.get_cost() + 0.5
def get_description(self):
return self._decorated_coffee.get_description() + ", Melk"
// Gebruik
coffee = SimpleCoffee()
print(f"{coffee.get_description()}: ${coffee.get_cost()}") # Eenvoudige koffie: $1.0
coffee_with_milk = MilkDecorator(coffee)
print(f"{coffee_with_milk.get_description()}: ${coffee_with_milk.get_cost()}") # Eenvoudige koffie, Melk: $1.5
Voordelen:
- Een flexibelere manier om de functionaliteit van objecten uit te breiden dan erfelijkheid.
- Vermijdt de proliferatie van subklassen gerelateerd aan erfelijkheid.
- Maakt het mogelijk om meerdere "lagen" van gedrag aan één object toe te voegen.
Nadelen:
- Kan de code complex maken door het grote aantal kleine objecten.
- De volgorde van het inpakken kan belangrijk zijn.
Toepassing in QA / Automatisering:
- Toevoegen van logging aan bestaande methoden zonder de broncode te wijzigen.
- Implementatie van foutafhandeling voor specifieke aanroepen.
- Toevoegen van timing of prestatie-metrics.
- Gebruik in testautomatiseringsbibliotheken (bijvoorbeeld in het Page Object patroon om controles of logging toe te voegen tijdens interactie met elementen).