WikiDer > Dekorateur

Decorator
Decorator UML-Klassendiagramm

EIN Dekorateur ist ein Designmuster vor dem Objektorientierung die einem Objekt dynamisch zusätzliche Funktionalität hinzufügt. Dies ist flexibler als die Erweiterung der Funktionalität durch Unterklassen. Decorator gehört zu den strukturierten Mustern.

Anwendung

Das Muster gilt in Situationen, in denen Objekten eine Funktionalität und dann eine andere hinzugefügt wird. Bei Verwendung von Vererbung müsste für jede Kombination von Funktionalitäten eine Unterklasse geschrieben werden, was in Bezug auf die Wartbarkeit des Quellcodes schnell ineffizient wird.

Ein weiterer Vorteil ist, dass die Funktionalität vor Ort wieder aufgehoben werden kann.

Der größte Nachteil besteht darin, dass ein neues (Dekorator-)Objekt erstellt wird, während die Vererbung dem gleichen Objekt Funktionalität hinzufügt.

Eine andere Methode, um mit ähnlichen Problemen umzugehen, ist Strategie-Muster. Wie bei der Vererbung wird die Funktionalität demselben Objekt hinzugefügt.

Verhalten

Struktur

UML-Decorator-Musterdiagramm

Bedienung und Eigenschaften

  • AbcComponent ist eine abstrakte Klasse (Abc steht für Abstrakte Basisklasse), die die Schnittstelle definiert, über die ein ComponentA-Objekt aufgerufen wird.
  • Ein AbcDecorator-Objekt imitiert ein ComponentA-Objekt.
  • Wenn AbcDecorator.Operation() aufgerufen wird, ruft es wiederum ComponentA.Operation() auf.
  • DecoratorA- und DecoratorB-Objekte fügen die Funktionalität hinzu.
  • Ein Decorator-Objekt kann KomponenteA ersetzen, ist jedoch ein anderes Objekt.

Überlegungen zur Implementierung

  • Der Dekorator muss die Schnittstelle der Komponente implementieren. Dies ist nur möglich, wenn dies bei der Auslegung des Bauteils berücksichtigt wurde. Viele Komponentenbibliotheken berücksichtigen dies.
  • Wenn nur eine Funktionalität hinzugefügt werden muss, können die Klassen AbcDecorator und ComponentA zu einer Klasse zusammengeführt werden. In diesem Fall führt die Operation()-Methode zuerst die Funktionalität von ComponentA aus und ruft dann Operation() der aggregierten Komponente auf.
  • Halten Sie die AbcComponent-Klasse so einfach wie möglich, indem Sie sie nur die Schnittstelle definieren lassen. All die zusätzlichen Dinge machen die Dekorateure unnötig schwer.