Meine Sicht auf das Thema.
Alle vier Muster haben viel gemeinsam, alle vier werden manchmal informell als Wrapper oder Wrapper-Muster bezeichnet. Alle verwenden Komposition, umbrechen den Betreff und delegieren die Ausführung irgendwann an den Betreff. Ordnen Sie einen Methodenaufruf einem anderen zu. Sie ersparen dem Kunden die Notwendigkeit, ein anderes Objekt erstellen und alle relevanten Daten kopieren zu müssen. Mit Bedacht sparen sie Speicher und Prozessor.
Durch die Förderung der losen Kopplung wird der einst stabile Code weniger unvermeidlichen Änderungen ausgesetzt und für andere Entwickler besser lesbar.
Adapter
Der Adapter passt das Subjekt (Adaptee) an eine andere Schnittstelle an. Auf diese Weise können wir Objekte hinzufügen, die einer Sammlung von nominell unterschiedlichen Typen hinzugefügt werden sollen.
Der Adapter stellt dem Client nur relevante Methoden zur Verfügung, kann alle anderen einschränken und Verwendungsabsichten für bestimmte Kontexte offenlegen, z. B. die Anpassung der externen Bibliothek, und lässt sie weniger allgemein und stärker auf unsere Anwendungsanforderungen ausgerichtet erscheinen. Adapter verbessern die Lesbarkeit und Selbstbeschreibung unseres Codes.
Adapter schützen ein Team vor flüchtigem Code anderer Teams. ein lebensrettendes Werkzeug im Umgang mit Offshore-Teams ;-)
Weniger erwähnt dient es dazu, zu verhindern, dass die Fachklasse die Anmerkungen überschreitet. Bei so vielen Frameworks, die auf Anmerkungen basieren, wird diese Verwendung wichtiger als je zuvor.
Der Adapter hilft dabei, die Java-Beschränkung nur einer einzelnen Vererbung zu umgehen. Es kann mehrere Adaptees unter einem Umschlag kombinieren, was den Eindruck einer Mehrfachvererbung erweckt.
Code weise ist der Adapter "dünn". Es sollte der adaptee-Klasse nicht viel Code hinzufügen, außer einfach die adaptee-Methode aufzurufen und gelegentlich Datenkonvertierungen durchzuführen, die für solche Aufrufe erforderlich sind.
Es gibt nicht viele gute Adapterbeispiele in JDK oder Basisbibliotheken. Anwendungsentwickler erstellen Adapter, um Bibliotheken an anwendungsspezifische Schnittstellen anzupassen.
Dekorateur
Decorator delegiert nicht nur, ordnet nicht nur eine Methode einer anderen zu, sie tun mehr, sie ändern das Verhalten einiger Subjektmethoden, es kann entscheiden, überhaupt keine Subjektmethode aufzurufen, an ein anderes Objekt zu delegieren, ein Hilfsobjekt.
Dekorateure fügen verpackten Objekten normalerweise (transparent) Funktionen wie Protokollierung, Verschlüsselung, Formatierung oder Komprimierung des Betreffs hinzu. Diese neue Funktionalität kann viel neuen Code bringen. Daher sind Dekorateure normalerweise viel „dicker“ als Adapter.
Der Dekorateur muss eine Unterklasse der Benutzeroberfläche des Subjekts sein. Sie können transparent anstelle der Themen verwendet werden. Siehe BufferedOutputStream, es ist immer noch OutputStream und kann als solches verwendet werden. Das ist ein großer technischer Unterschied zu Adaptern.
Lehrbuchbeispiele der gesamten Dekorateurfamilie sind in JDK - dem Java IO - leicht zu finden. Alle Klassen wie BufferedOutputStream , FilterOutputStream und ObjectOutputStream sind Dekoratoren von OutputStream . Sie können mit Zwiebeln überzogen werden, wobei ein Dekorateur erneut dekoriert wird, wodurch mehr Funktionalität hinzugefügt wird.
Proxy
Proxy ist kein typischer Wrapper. Das umschlossene Objekt, das Proxy-Subjekt, ist zum Zeitpunkt der Proxy-Erstellung möglicherweise noch nicht vorhanden. Proxy erstellt es häufig intern. Es kann sich um ein schweres Objekt handeln, das bei Bedarf erstellt wird, oder es handelt sich um ein Remote-Objekt in einer anderen JVM oder einem anderen Netzwerkknoten und sogar um ein Nicht-Java-Objekt, eine Komponente im nativen Code. Es muss überhaupt nicht umbrochen oder an ein anderes Objekt delegiert werden.
Die typischsten Beispiele sind Remote-Proxys, Initialisierer für schwere Objekte und Zugriffsproxys.
Remote-Proxy - Betreff befindet sich auf einem Remote-Server, einer anderen JVM oder sogar einem Nicht-Java-System. Proxy übersetzt Methodenaufrufe in RMI / REST / SOAP-Aufrufe oder was auch immer erforderlich ist, um den Client vor dem Kontakt mit der zugrunde liegenden Technologie zu schützen.
Lazy Load Proxy - Initialisieren Sie das Objekt nur bei der ersten oder ersten intensiven Nutzung vollständig.
Access Proxy - Kontrolliert den Zugriff auf den Betreff.
Fassade
Die Fassade ist eng mit dem Gestaltungsprinzip des geringsten Wissens (Gesetz des Demeters) verbunden. Fassade ist Adapter sehr ähnlich. Sie wickeln beide ein, sie ordnen ein Objekt einem anderen zu, aber sie unterscheiden sich in der Absicht. Die Fassade glättet die komplexe Struktur eines Subjekts und das komplexe Objektdiagramm und vereinfacht den Zugriff auf eine komplexe Struktur.
Die Fassade umhüllt eine komplexe Struktur und bietet eine flache Schnittstelle. Dies verhindert, dass das Client-Objekt inneren Beziehungen in der Subjektstruktur ausgesetzt wird, wodurch eine lose Kopplung gefördert wird.
Brücke
Komplexere Variante des Adaptermusters, bei der nicht nur die Implementierung variiert, sondern auch die Abstraktion. Es fügt der Delegation eine weitere Indirektion hinzu. Die zusätzliche Delegation ist die Brücke. Es entkoppelt den Adapter sogar von der Anpassung der Schnittstelle. Es erhöht die Komplexität mehr als jedes andere Verpackungsmuster. Wenden Sie es daher mit Vorsicht an.
Unterschiede in den Konstruktoren
Musterunterschiede sind auch bei der Betrachtung ihrer Konstruktoren offensichtlich.
Der Proxy umschließt kein vorhandenes Objekt. Es gibt kein Thema im Konstruktor.
Decorator und Adapter umschließen bereits vorhandene Objekte, und diese werden normalerweise
im Konstruktor bereitgestellt.
Der Fassadenkonstruktor verwendet das Stammelement eines gesamten Objektdiagramms, ansonsten sieht es genauso aus wie der Adapter.
Beispiel aus dem wirklichen Leben - JAXB Marshalling Adapter . Zweck dieses Adapters ist die Zuordnung einer einfachen flachen Klasse zu einer komplexeren Struktur, die extern erforderlich ist, und um zu verhindern, dass die Subjektklasse mit übermäßigen Anmerkungen "verschmutzt" wird.