Proxy-, Decorator-, Adapter- und Brückenmuster

1. Einleitung

In diesem Artikel konzentrieren wir uns auf strukturelle Entwurfsmuster in Java - und diskutieren, was dies sind und einige grundlegende Unterschiede zwischen einigen von ihnen.

2. Strukturelle Entwurfsmuster

Gemäß der Gang Of Four (GoF) können Entwurfsmuster in drei Typen eingeteilt werden:

  1. Kreativ
  2. Strukturell
  3. Verhalten

Einfach ausgedrückt, Strukturmuster befassen sich mit der Zusammensetzung von Klassen und Objekten. Sie bieten verschiedene Möglichkeiten zur Verwendung der Objektzusammensetzung und -vererbung, um eine gewisse Abstraktion zu erstellen.

3. Proxy-Muster

Mit diesem Muster erstellen wir einen Vermittler, der als Schnittstelle zu einer anderen Ressource fungiert , z. B. einer Datei oder einer Verbindung. Dieser sekundäre Zugriff bietet einen Ersatz für die reale Komponente und schützt sie vor der zugrunde liegenden Komplexität.

Ein detailliertes Beispiel für das Muster finden Sie in dem entsprechenden Beitrag: Das Proxy-Muster in Java.

Wichtige Differenzierungspunkte:

  • Der Proxy bietet dieselbe Schnittstelle wie das Objekt, auf das er verweist, und ändert die Daten in keiner Weise. Dies steht im Gegensatz zu Adapter- und Decorator-Mustern, die die Funktionen bereits vorhandener Instanzen ändern bzw. dekorieren
  • Der Proxy verfügt normalerweise über die Informationen zum eigentlichen Thema zur Kompilierungszeit selbst, während Decorator und Adapter zur Laufzeit injiziert werden und nur die Schnittstelle des tatsächlichen Objekts kennen

4. Dekorationsmuster

Dieses Muster ist nützlich, um das Verhalten eines Objekts zu verbessern. Eine detaillierte Übersicht finden Sie im fokussierten Tutorial hier: Decorator Pattern in Java

Hauptunterschiede:

  • Obwohl Proxy- und Decorator-Muster ähnliche Strukturen aufweisen, unterscheiden sie sich in ihrer Absicht. Während der Hauptzweck von Proxy darin besteht, die Benutzerfreundlichkeit oder den kontrollierten Zugang zu erleichtern, bringt ein Dekorateur zusätzliche Verantwortlichkeiten mit sich
  • Sowohl Proxy- als auch Adaptermuster enthalten einen Verweis auf das ursprüngliche Objekt
  • Alle Dekorateure aus diesem Muster können unendlich oft rekursiv verwendet werden, was bei anderen Modellen nicht möglich ist

5. Adaptermuster

Das Adaptermuster wird zum Verbinden von zwei inkompatiblen Schnittstellen verwendet, die ansonsten nicht direkt verbunden werden können. Ein Adapter umschließt eine vorhandene Klasse mit einer neuen Schnittstelle, damit sie mit der benötigten Schnittstelle kompatibel wird.

Eine ausführliche Beschreibung und Implementierung finden Sie im entsprechenden Beitrag: Adaptermuster in Java

Die Hauptunterschiede zwischen Adapter- und Proxy-Mustern sind:

  • Während der Proxy dieselbe Schnittstelle bietet, bietet der Adapter eine andere Schnittstelle, die mit seinem Client kompatibel ist
  • Das Adaptermuster wird verwendet, nachdem die Anwendungskomponenten so entworfen wurden, dass wir sie verwenden können, ohne den Quellcode zu ändern. Dies steht im Gegensatz zum Brückenmuster, das vor dem Entwurf der Komponenten verwendet wird.

6. Brückenmuster

Das Bridge-Muster wird verwendet, um eine Abstraktion von ihrer Implementierung zu entkoppeln, sodass die beiden unabhängig voneinander variieren können.

Dies bedeutet, eine Bridge-Schnittstelle zu erstellen, die OOP-Prinzipien verwendet, um Verantwortlichkeiten in verschiedene abstrakte Klassen aufzuteilen.

Eine ausführliche Beschreibung und Implementierung finden Sie im entsprechenden Beitrag: Bridge Pattern in Java

Wichtige Differenzierungspunkte :

  • Ein Bridge-Muster kann nur implementiert werden, bevor die Anwendung entworfen wurde.
  • Ermöglicht eine unabhängige Änderung von Abstraktion und Implementierung, während ein Adaptermuster die Zusammenarbeit inkompatibler Klassen ermöglicht

7. Fazit

In diesem Artikel haben wir uns auf das strukturelle Entwurfsmuster und die Unterschiede zwischen einigen seiner Typen konzentriert.

Wie immer finden Sie die vollständige Implementierung dieses Tutorials auf Github.