Unterschied zwischen dem Adapter-Muster und dem Proxy-Muster?

33

Nach unserem Verständnis erstellt das Adaptermuster ein Wrapper-Objekt für unser eigentliches interessierendes Objekt, einfach eine weitere Indirektionsebene, die Flexibilität bietet. Die Flexibilität besteht darin, dass, wenn die Schnittstelle des realen Objekts geändert wird, die Wrapper-Schnittstelle geändert wird, die auf das reale Objekt zeigt, und die clientseitig offen gelegte Schnittstelle unverändert bleibt.

Das Proxy-Muster ist das gleiche, mit dem Unterschied, dass jeder Proxy-Wrapper nur eine zusammenhängende Teilmenge der Funktionalität des realen Objekts bereitstellt. Warum wäre dies nützlich, wenn wir uns bemühen, "eine Klasse für einen Zweck" zu schaffen, ist mir ein Rätsel.

Habe ich das richtig verstanden?

Vorac
quelle

Antworten:

55

Nicht komplett.

Der Hauptzweck des Adaptermusters besteht darin, die Schnittstelle von Klasse / Bibliothek A an die Erwartungen von Client B anzupassen. Die typische Implementierung ist eine Wrapper-Klasse oder eine Menge von Klassen. Der Zweck ist nicht, zukünftige Schnittstellenänderungen zu vereinfachen, sondern aktuelle Inkompatibilitäten der Schnittstelle.

Das Proxy-Muster verwendet ebenfalls Wrapper-Klassen, jedoch für einen anderen Zweck. Der Zweck des Proxy-Musters besteht darin, eine Ersatzressource für eine echte Ressource zu erstellen. Gründe für die Verwendung eines Proxys können sein

  • Die reale Ressource befindet sich auf einem Remote-Computer (der Proxy erleichtert die Interaktion mit der Remote-Ressource).
  • Die Erstellung der realen Ressource ist teuer (der Proxy stellt sicher, dass die Kosten erst dann anfallen, wenn sie wirklich benötigt werden).

Das Wichtigste ist, dass ein Proxy einen Drop-In-Ersatz für die reale Ressource bietet, für die er ein Ersatz ist, und daher dieselbe Schnittstelle bereitstellen muss.

Bart van Ingen Schenau
quelle
Zunächst einmal vielen Dank für die tolle Antwort. Implementiert ein Proxy alle Schnittstellen, die der aktuelle Client benötigt, oder implementiert er alle Schnittstellen, die die eigentliche Ressource bereitstellt?
Vorac
1
@Vorac: Das hängt von der Komplexität der Benutzeroberfläche und Ihrer Designphilosophie ab. Beides ist möglich, aber wenn die Schnittstelle groß / komplex ist oder Sie fest an YAGNI glauben, ist es sinnvoller, nur das zu implementieren, was Sie benötigen.
Bart van Ingen Schenau
Handelt es sich bei dem Adaptermuster, das Wrapper-Klassen verwendet, um ein Proxy-Muster?
Moonman239
@ moonman239: Nein, da die Absicht, eine Wrapper-Klasse zu verwenden, anders ist. Nur weil zwei Muster in einem Klassendiagramm ähnlich aussehen, bedeutet dies nicht, dass sie miteinander verwandt sind oder sich gegenseitig implementieren. Ein wesentlicher Faktor für unterschiedliche Muster ist ihre Absicht.
Bart van Ingen Schenau