Bridge vs. Adapter Design Pattern
Ich wurde in Frage gestellt von einem Kollegen über das design-Muster von meiner Implementierung eines WCF-windows-Dienst in einem ASP.net client-Anwendung, und ich konnte wirklich nicht sagen, ob es Brücke oder Adapter!
Hier ist die Umsetzung:
- Ich erhalten haben, die den service-Vertrag
- Definiert eine neue Schnittstelle, die ähnlich wie meine WCF Data Vertrag
- Erstellte ich einen WCF-client und wickelte es in das neue interface
- Zugeordnet, die neue interface-Operationen auf dem ursprünglichen WCF-client (habe ich einige logging/error-handling hier)
Ich dachte immer, es als eine Implementierung von Adapter Muster, aber ich kann wirklich nicht sagen, warum es ist nicht Brücke!
Ich habe alle posts gelesen hier, in SO, GoF und wikipedia, aber es macht wirklich keinen Sinn!
Aus meinem Verständnis, Sowohl Muster verweisen auf einen vorhandenen Typ, beide entkoppelt eine Abstraktion von Ihrer Implementierung bin ich fehlt ein Punkt?
Hier ist von GoF:
Den wichtigsten Unterschied zwischen diesen beiden mustern liegt in Ihren Absichten.
Adapter konzentriert sich auf die überwindung von Inkompatibilitäten zwischen zwei bestehenden
- Schnittstellen. Es konzentriert sich nicht auf, wie diese Schnittstellen implementiert werden,
noch ist es zu betrachten, wie Sie sich entwickeln könnte unabhängig. Es ist ein Weg,
von zwei unabhängig voneinander gestaltet-Klassen arbeiten zusammen, ohne
reimplementing eine oder das andere. Brücke, auf der anderen Seite, Brücken eine
Abstraktion und Ihrer (möglicherweise zahlreichen) Implementierungen. Es
bietet eine stabile Schnittstelle zu Kunden auch so können Sie variieren die
Klassen, die es implementieren. Sondern auch Platz für neue Implementierungen, die
das system entwickelt.
Verstehe ich nicht die Aussage,
- Bedeutet es, dass, wenn ich variieren die adaptee oder ändern Sie die Implementierung
der ursprüngliche Schnittstelle zur design-Zeit, dann ist es Brücke Muster? - Die Unterschiede klingt trivial, Ist es andere Unterschiede in der
Umsetzung/abstcation? - Wie kann jemand sagen, welche Implementierung verwendet wird nach
Entwicklung? - Kann mir jemand ein gutes Beispiel für bridge-pattern und wie kann es
geändert werden, während der software-Lebenszyklus?
Update:
Wieder von GoF:
Denken Sie daran, dass ein adapter macht zwei bestehenden Schnittstellen arbeiten zusammen
im Gegensatz zu der Definition eines ganz neuen.
Bedeutet es, dass eine änderung der bestehenden Schnittstelle, so dass es funktionieren kann mit einer anderen Schnittstelle ist eine Implementierung von Adapter?
Update2:
Gerade diese unglaubliche Artikel: Illustrierte GOF-Design-Patterns in C#
Dies ist die wahre Brücke Prasseln Struktur:
Fehlte mir die Tatsache, dass die Brücke Muster können Sie kombinieren die verschiedenen Abstraktionen und Implementierungen und erweitern Sie unabhängig
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke nicht, dass du rein GoF-Muster hier. Es ist etwas zwischen Decorator-und Adapter. Ändern Sie die Schnittstelle des service-client (Anpassung an Bedarf). Aber auch Sie sind das hinzufügen neuer Aufgaben zu client (logging und error handling) - das ist ein Deko-Teil. Wenn Sie bleiben würde, mit original-service-Schnittstelle, es wäre Reine Dekorateur.
UPDATE: Jede Verwendung von Vererbung bedeutet nicht, dass wir einige der GoF-Muster. Es gibt mehrere Dinge, die Ihre aktuellen Architektur fehlt, um die Brücke:
Mir wurde erklärt, das bridge-pattern als die Absicht zu kombinieren, zwei-Klassen-Hierarchien mit unterschiedlichen Zwecken. Zum Beispiel Sie schreiben einen Fenster-Rahmen mit verschiedenen Arten von Kontrollen und die Unterstützung der verschiedenen Fenster-Systeme. Sie hätten eine Klasse tree für die Bedienelemente und anderen zu abstrahieren, die Unterschiede zwischen den Fenster-Systemen. Nun, wenn Sie wollen, um Unterstützung für ein anderes window-system, fügen Sie einfach, dass auf diese Seite der Hierarchie, und wenn Sie wollen, um neue Steuerelemente hinzufügen, fügen Sie Sie auf Ihre Seite. Die "Brücke" besteht zwischen den top-Klassen der beiden Hierarchien, wo Ihre Kontroll-Klasse hat Zugriff auf die abstrakten Funktionen definiert durch die Basisklasse der Klassenhierarchie Implementierung der Unterstützung für die verschiedenen Fenster-Systeme.
Mit dem adapter-Muster, die Sie nicht wollen, kombinieren Sie zwei Hierarchien von Klassen mit unterschiedlichen Intentionen, aber das anpassen einer Klasse arbeiten mit Ihrem eigenen interface. Ich nehme an, wenn Sie unterstützt nur einen single-window-system in der Beispiel oben und nicht setzen eine abstrakte Klasse dazwischen zu halten Erweiterbarkeit, das wäre ein adapter der anstelle einer Brücke.
Diese wurde bereits hier diskutiert - Unterschied zwischen Bridge-Muster und Adapter-Muster - Die echte quote, die Sie möchten aus der GoF-ist " - Adapter macht die Dinge funktionieren, nachdem Sie schon entworfen; Brücke macht Ihnen zu arbeiten, bevor Sie sind. [GoF, p219]
Deiner letzten Frage wird eine ja - ein adapter wird verwendet, um zwei ansonsten unliebsamen Elementen eines Systems spielen schön zusammen, ohne Ihre grundlegende Funktionalität hinaus möglicherweise Untergruppen der union von Ihren Funktionalitäten -
Einer Brücke Muster ist in der Regel befassen sich mit Themen, die im ursprünglichen Entwurf, wo das mentale Modell vorgestellt, der Verbraucher könnte Wild unterscheidet sich von dem Modell, das realisiert die Umsetzung der Verbraucher-Modell. Betrachten Sie ein high-performance-math-Bibliothek, die genauso aussieht in einer Vielzahl von Prozessoren - Sie wollen einfach nur zu multiplizieren, Matrizen, aber hinter den kulissen gibt es alle möglichen Reste mit swizzling, parallele Datenströme, merkwürdiges Verhalten zu vermeiden, pipeline stalls, und alles anders gemacht wird, auf 3+ Erkenntnisse ein high-performance-superscaler Kern - und das ist nur Intel 🙁