Hallo Spaß-Coder.
Das nächste Entwurfsmuster in unserer Reihe ist erneut aus der Kategorie der Strukturmuster. Wir beschäftigen uns diesmal mit der Brücke (engl. Bridge). Auch dieses Muster stammt aus der Sammlung der Gang of Four.
Wie funktioniert die Brücke?
Wir haben uns durch das Prinzip „Program to the interface“ bereits daran gewöhnt, dass wir unsere Implementierung über Schnittstellen abstrahieren um die Wiederverwendbarkeit zu gewährleisten. Die Brücke dient nun dazu, nicht nur die Implementierung zu variieren, sondern dies auch für die Abstraktion, also die Schnittstelle, zu ermöglichen.
Dazu werden sowohl die Abstraktionsschicht, als auch die Implementierungsschicht noch einmal abstrahiert und anschließend über eine 1:1 Verbindung dieser Abstraktionen wieder miteinander verbunden.
Ein Beispiel
Nehmen wir einmal an, wir möchten Daten aus einem externen System an unsere Anwendung anbinden. Das externe System tauscht mit uns Daten über eine REST-Schnittstelle in Form von JSON aus. Leider ändert der Hersteller des anderen Systems die Schnittstelle in regelmäßigen Abständen, um sie um Funktionen zu erweitern. Unsere Anwendung soll aber nun abwärtskompatibel mit allen Schnittstellen zurecht kommen und wir möchten unsere internen Abläufe nicht anpassen müssen, wenn die Schnittstelle um eine Funktion erweitert wird, die wir gar nicht verwenden möchten.
„Extern“ spricht nun in den jeweiligen Implementierungen (V2 oder V3) mit der externen Anwendung. Möchten wir hingegen unsere Schnittstelle ändern, passen wir „Daten“ an. Durch die Entkopplung hat dies keinen Einfluss auf die externe Anwendung.
Wichtig zum Verständnis ist, dass alle hier verwendeten Klassen in unserer Hoheit liegen. Die tatsächliche externe Anwendung wird in den Implementierungen verwendet (hier: ExternV2 und ExternV3).
Für alle, die noch ein wenig tiefer graben möchten haben wir auch wieder Beispielcode. Zu finden ist er wie immer in unserem GitHub-Repository[1] und basiert auf dem im Artikel Das Eckige muss in das Runde … aber das passt doch gar nicht! aufgeführtem Beispiel einer Finanzverwaltung um Ein- und Ausgaben zu dokumentieren und auswerten zu können.
Wann ist die Brücke sinnvoll anzuwenden?
Immer dann, wenn wir bei der Implementierung bereits absehen können, dass sich die Abstraktionsschicht voraussichtlich ebenfalls ändern wird, ist es sinnvoll, die Brücke zu verwenden. Tatsächlich können wir die Brücke auch recht leicht noch nachträglich hinzufügen, wenn wir zunächst nur die Implementierung abstrahiert haben.
Zusammenfassung
Wir hoffen, das wir euch eine Brücke bauen konnten, die euch vielleicht in Zukunft sicheren und trockenen Fußes auf die andere Seite einer Schnittstelle bringen wird.
Mit Hilfe der Brücke können wir flexibler auf Situationen reagieren, in denen sich sowohl die Implementierung, als auch die Abstraktion ändert. Dies ist insbesondere dann von Vorteil, wenn wir externe Schnittstellen anbinden müssen, auf die wir nicht unbedingt Einfluss haben.
Die Implementierung der Brücke führt zu einer höheren Komplexität des Codes. Wir sollten das Muster also nicht auf gut Glück einfach immer verwenden, sondern uns gut überlegen, ob wir den Vorteil auch wirklich ausnutzen können.
Habt ihr die Brücke schon einmal in diesem oder einem anderen Kontext verwendet? Lasst und teilhaben an euren Erfahrungen.
Eure Spaß-Coder
Dieser Artikel basiert neben unseren Erfahrungen auf den Ausführungen aus:
- https://de.wikipedia.org/wiki/Br%C3%BCcke_%28Entwurfsmuster%29
- http://www.tutorialspoint.com/design_pattern/bridge_pattern.htm
- Freeman, Eric & Freeman, Elisabeth – Entwurfsmuster von Kopf bis Fuß – O’Reilly, 2006.
Code-Beispiele auf Github:
- [1] https://github.com/invidit/CodeQuality.git
Kommt hier nichts mehr ? 🙁
war ein schöner blog
Danke für das Kompliment, schön, das dir die bisherigen Beiträge gefallen haben. Leider lässt es unsere Zeit und auch unsere berufliche Ausrichtung aktuell nicht mehr zu, weitere Themen für den Blog aufzubereiten.
Sorry 🙁