1.12.2021

Das Decorator Pattern

Das objektorientierte Decorator Pattern ist perfekt für Situationen, wo die Funktionalität eines bestehenden Objektes erweitert oder abgeändert werden soll, es aber weiterhin auch in seiner ursprünglichen Form gebraucht wird. In solchen Fällen ist eine Subklasse keine Option, da sie zwar Funktionalität ergänzt, aber nicht erlaubt beide Instanzen parallel weiter zu nutzen, ohne, dass sie voneinander Abweichen.

Technisch wird dieses Pattern realisiert, indem der Decorator eine Referenz auf die zu dekorierende Klasse hält und diese wrapped. So kann sie neue Funktionalitäten implementieren, Anfragen an die zu dekorierende Klasse durchreichen oder sogar Aufrufe und Antworten an die zu dekorierende Klasse modifizieren. Wenn nur bestehende Schnittstellen modifiziert werden, ist es zusätzlich möglich mittels eines Interfaces Decorator und die zu dekorierende Klasse austauschbar zu verwenden. Das dekorierende einer Klasse kann zur Laufzeit geschehen und auch wieder rückgängig gemacht werden und die zu dekorierende Klasse lässt sich sogar austauschen.

Beispiel

Mein Code ist unter anderem dafür verantwortlich Location-Informationen aus Fotos auszuwerten. Dazu bekommt er eine Fotos-Klasse übergeben und würde jetzt eigentlich gerne eine Methode auf dieser aufrufen, welche ihm direkt die Koordinaten gibt, an denen das Foto aufgenommen wurde. Noch besser wäre sogar, wenn das Ergebnis gleich im richtigen Format ist. Die Fotos-Klasse hat aber keine Methode wie getLocation(), da dies in ihrem Context nicht relevant war. Stattdessen müsste man umständlich erst die Metadaten auslesen, dort das passende Feld für die Location finden und die Daten dann noch bereinigen und in das gewünschte Format bringen. Anstelle das alles jedes mal so zu tun, kann man hier mittels eines Decorators die ursprüngliche Klasse wrappen und um eine neue Methode ergänzen, welche all dies übernimmt.

Alternativ könnte es den Fall geben, dass verschiedene Stellen mit einem Bild arbeiten wollen, dieses aber zwingend einer Farbkorrektur bedarf, das Original aber unverändert bleiben muss. Hier kann man mittels eines Decorators die Korrektur implementieren, ohne auch nur eine Anpassung am weiteren Code vornehmen zu müssen. Denn Decorator und die originale Foto-Klasse implementieren das selbe Interface.

Sven

Softwareentwickler

Zur Übersicht

Standort Hannover

newcubator GmbH
Bödekerstraße 22
30161 Hannover

Standort Dortmund

newcubator GmbH
Westenhellweg 85-89
44137 Dortmund