Een decorator is een ontwerppatroon voor objectoriëntatie dat dynamisch extra functionaliteit toevoegt aan een object. Dit is flexibeler dan uitbreiding van functionaliteit door middel van subklassen. Decorator behoort tot de structuurpatronen.

Decorator UML class diagram

Toepassing bewerken

Het patroon is van toepassing in situaties waarbij aan objecten nu eens de ene en dan weer de andere functionaliteit toegevoegd wordt. Indien overerving gebruikt zou worden zou voor elke combinatie van functionaliteiten een subklasse geschreven moeten worden hetgeen al snel inefficiënt wordt in termen van onderhoudbaarheid van broncode.

Een ander voordeel is dat de functionaliteit ter plekke weer kan worden opgeheven.

Grootste nadeel is dat er een nieuw (decorator-)object gemaakt wordt terwijl bij overerving de functionaliteit aan hetzelfde object wordt toegevoegd.

Een andere methode om soortgelijke problematiek het hoofd te bieden is het strategy-patroon. Net als overerving wordt de functionaliteit aan hetzelfde object toegevoegd.

Gedrag bewerken

Structuur

 
UML diagram van het decoratorpatroon

Werking en eigenschappen

  • AbcComponent is een abstracte klasse (Abc staat voor Abstract base class)die de interface definieert waarmee een ComponentA-object aangeroepen wordt.
  • Een AbcDecorator-object geeft zich uit voor een ComponentA-object.
  • Wanneer AbcDecorator.Operation() aangeroepen wordt roept deze op zijn beurt ComponentA.Operation() aan.
  • DecoratorA- en DecoratorB-objecten voegen de functionaliteit toe.
  • Een decorator-object kan de plaats innemen van ComponentA, maar is wel een ander object.

Implementatie-overwegingen bewerken

  • De decorator moet de interface van de component implementeren. Dit is alleen mogelijk als hier bij het ontwerp van de component rekening mee is gehouden. Veel component-bibliotheken houden hier rekening mee.
  • Indien er slechts één functionaliteit toegevoegd hoeft te kunnen worden kunnen de klassen AbcDecorator en ComponentA samengevoegd worden tot één klasse. De Operation() methode voert in dat geval eerst de functionaliteit van ComponentA uit, en roept daarna de Operation() van de geaggregeerde component aan.
  • Houdt de klasse AbcComponent zo licht mogelijk door deze uitsluitend de interface te laten definiëren. Alle extra zaken maken de decorators onnodig zwaar.