Konzept
Das Dekoratormuster ordnet Objekten dynamisch Verantwortlichkeiten zu. Um die Funktionalität zu erweitern, bieten Dekoratoren eine flexiblere Alternative zur Vererbung.
Der Dekorateur und das dekorierte Objekt haben denselben Supertyp.
Sie können ein Objekt mit einem oder mehreren Dekoratoren umhüllen.
Da der Dekorateur und das dekorierte Objekt denselben Supertyp haben, kann jedes Mal, wenn das Originalobjekt (verpackt) benötigt wird, stattdessen das dekorierte Objekt verwendet werden.
Der Dekorateur kann sein eigenes Verhalten vor und/oder nach dem Verhalten des delegierten Dekorateurs hinzufügen, um einen bestimmten Zweck zu erreichen.
Objekte können jederzeit dekoriert werden, sodass Sie
Objekte zur Laufzeit dynamisch und unbegrenzt mit Ihren bevorzugten Dekorateuren dekorieren können.
In Java sind viele Klassen unter dem io-Paket die Verkörperung des typischen Dekoratormusters, wie zum Beispiel:
new BufferedOutputStream(OutputStream out)
new BufferedInputStream(InputStream in );
neuer PrintWriter(OutputStream out)
neuer FilterReader(Reader in);
Die dekorierte Klasse implementiert die gleiche Schnittstelle wie die dekorierte Klasse, und
ist dekorierte Klasse, es spielt keine Rolle, welche Implementierungsklasse zum Dekorieren verwendet wird
Die gleiche Geschäftsmethode, die dekorierte Klasse ruft die Methode der Dekorationsklasse auf, um die Funktion der Dekorationsklasse zu verbessern
Instanz :
Klassendiagramm
public interface IReader { void read(); } public class Reader implements IReader { @Override public void read() { System.out.println("read of Reader"); } } public class BufferedReader implements IReader { private IReader mReader; public BufferedReader(IReader reader) { this.mReader = reader; } @Override public void read() { System.out.println("read of BufferedReader"); mReader.read(); } } public class Test { public static void main(String[] args) { Reader reader = new Reader(); reader.read(); System.out.println("----------"); BufferedReader bufferedReader = new BufferedReader(reader); bufferedReader.read(); } }
Eigenschaften:
1. Dekorierte Objekte haben die gleiche Schnittstelle wie echte Objekte. Auf diese Weise kann das Client-Objekt mit dem dekorierten Objekt auf die gleiche Weise interagieren wie ein reales Objekt.
2. Das dekorierte Objekt enthält einen Verweis auf das reale Objekt
3 Das dekorierte Objekt akzeptiert alle Anfragen des Kunden. Es leitet diese Anfragen an die realen Objekte weiter.
4. Das Dekorationsobjekt kann vor oder nach der Weiterleitung dieser Anfragen einige zusätzliche Funktionen hinzufügen. Dadurch wird sichergestellt, dass zusätzliche Funktionalität zur Laufzeit extern hinzugefügt werden kann, ohne die Struktur eines bestimmten Objekts zu ändern.
Im objektorientierten Design wird die funktionale Erweiterung einer bestimmten Klasse normalerweise durch Vererbung implementiert. Nach der Dekoration wird das reale Objekt festgehalten, um seine Funktionalität zu verbessern.
Der Unterschied zwischen Dekorator- und Adaptermustern:
Über neue Verantwortlichkeiten: Adapter können während der Konvertierung auch neue Verantwortlichkeiten hinzufügen, aber der Hauptzweck liegt hier nicht. Das Dekorationsmuster fügt dem Dekorateur hauptsächlich neue Verantwortlichkeiten hinzu.
Über das Objekt, das er umhüllt: Der Adapter kennt die Details der anzupassenden Person (d. h. die Adapterklasse). Der Dekorateur kennt nur den spezifischen Typ seiner Schnittstelle (ob es sich um eine Basisklasse oder eine andere abgeleitete Klasse handelt) nur zur Laufzeit.