Die Folien aus meinem Kurs in Softwarearchitektur deuten darauf hin, dass dies separate Begriffe sind, aber ich kann den Unterschied nicht feststellen. Übersetzen nicht alle nur Schnittstellen?
Die Folien aus meinem Kurs in Softwarearchitektur deuten darauf hin, dass dies separate Begriffe sind, aber ich kann den Unterschied nicht feststellen. Übersetzen nicht alle nur Schnittstellen?
Antworten:
In der frühen Musterforschung war es sehr üblich, über strukturelle Unterschiede in der Implementierung hinaus viel Wert auf die "beabsichtigte Verwendung" eines Musters zu legen. Dann entwickelten Menschen, die sich in einem Stadium der architektonischen Reife befanden, in dem sie "Muster machten, weil Muster das sind, was Sie tun", lange, oft ausführliche Erklärungen, warum diese angeblichen Unterschiede wichtig waren.
Untersuchungen haben jedoch gezeigt, dass die Struktur wirklich alles ist, was zählt, weil die semantischen Unterscheidungen:
So viele dieser großen Diskussionen darüber, warum Strategie anders ist als Staat, haben sich im Laufe der Jahre als ziemlich mühsam, nicht überzeugend, ineffektiv und leicht humorvoll herausgestellt.
Mein Vorschlag ist, jegliche "wird für" -Diskussion überhaupt zu ignorieren und sich vollständig auf die Typbeziehungen zu konzentrieren. Wenn Sie das tun, werden Sie das finden (abhängig von Ihrer speziellen Definition dieser Muster, aber hier ziemlich normal)
Mediator> Bridge> Adapter
wobei die> Beziehung als "wird implementiert mit" gelesen werden sollte. Der Adapter ist eine funktionale Beziehung zwischen drei oder mehr Typen in einem Abstraktionsbaum. Bridge und Mediator sind funktionale Beziehungen zwischen vier oder mehr Typen um zwei Abstraktionsbäume und definieren eine Schnittstelle zwischen den Abstraktionsbäumen. Mediator ergänzt die Nutzungsbeziehungen für die Typkopplung zwischen konkreten Knoten der Abstraktionsbäume.
In der Regel ist Mediator ein schlechtes Muster (Antipattern), das nicht gut skaliert und dazu führt, dass eine Anwendung monolithisch wird. Es wird sehr häufig verwendet, weil die Leute lesen, was es tut und sagen "Oh, ich brauche das" und ein Muster verwenden, weil, wie oben, Muster "das sind, was Sie verwenden". Sie können ein Zwischenschritt sein, während eine stark gekoppelte Anwendung während des Refactorings entkoppelt wird. Wenn Sie diesen Schritt jedoch ausführen, wird normalerweise eine vollständige Entkopplung zu Bridge (mit einer Fabrik) angezeigt und ist ebenso einfach.
Generell gibt es in der Informatik viele Vorstellungen von Schnittstellen. Sie sollten wahrscheinlich sagen, dass Sie über Designmuster sprechen. Im entsprechenden Wikipedia-Artikel gibt es eine Klassifizierung verschiedener Muster, die die Dinge klarer macht:
Das Mediatormuster ist verhaltensbezogen (über die Kommunikation zwischen Schnittstellen) und vereint mehrere Schnittstellen, insbesondere ihre Art der Kommunikation, ähnlich wie bei einem tatsächlichen Mediator.
Die anderen beiden sind strukturell (tatsächlich werden Schnittstellen verglichen):
Das Wrapper / Adapter-Muster konzentriert sich darauf, eine Schnittstelle kompatibel zu machen, beispielsweise wenn ein Client andere Konventionen verwendet.
Beim Brückenmuster geht es darum, zu trennen, was die Klasse tun soll (Abstraktion) und wie sie es tatsächlich tut (Implementierung). Auf diese Weise können Sie die Abstraktion verwenden, ohne zu wissen, wie sie implementiert ist. Dies ist hilfreich, wenn sich der Code ändert (für beide Seiten).
Es gibt Unterschiede. Die meisten von ihnen sind so subtil, dass es Sie nicht interessiert, aber sie unterscheiden sich im Allgemeinen entweder in der Absicht oder in der Implementierung. Die übergeordnete Idee besteht darin, Klasse A Zugriff auf die Funktionalität von Klasse B zu gewähren, ohne dass A darauf achten muss, dass B die Arbeit erledigt (sodass eine Klasse C ersetzt werden kann, ohne dass sich eines dieser Objekte ändern muss). Diese Idee wird typischerweise als "lose Kopplung" bezeichnet und ist allgemein zu fördern.
Eine Brücke ist die grundlegendste Definition der Absicht, A und B zu entkoppeln. das an und für sich ist der Zweck. A kennt stattdessen eine Schnittstelle I, die B implementiert. Eine Klasse C kann auch I implementieren und kann frei ersetzt werden.
Ein "Wrapper" oder Adapter wird normalerweise mit der Absicht geschrieben, die Schnittstelle von B so zu ändern, dass sie dem Funktionsumfang entspricht, den A von seiner Abhängigkeit I erwartet. Wenn A erwartet, dass ich eine "DoThis ()" - Methode mit drei Parametern habe, aber Die Methode mit der Funktionalität, die A für B benötigt, heißt tatsächlich "DoThat ()" und verwendet einen Parameter. Es kann ein Adapter W geschrieben werden, der von B (oder der Schnittstelle IB von B) abhängig ist, I implementiert und B.DoThat () aufruft. von seiner eigenen DoThis () -Methode (Übergabe des Parameters, den es ohne das Wissen von A gewinnen kann). Wenn stattdessen C benötigt wird und sich von B unterscheidet, kann ein anderer Adapter W2 geschrieben werden, der ein C verwendet und auch I implementiert, sodass sich A, W, I, B und C nicht ändern müssen.
Mediatormuster sind im Grunde genommen ein Adapter, der als Brücke verwendet wird. Ein Mediator ist sein eigenes Objekt M, das über B Bescheid weiß und an A übergeben wird. Wenn A Methoden für M aufruft, werden diese Aufrufe an B weitergeleitet. M kann zusätzliche Aufgaben ausführen, z. B. die bidirektionale Kommunikation zwischen A und B. B muss möglicherweise die Daten von A ändern oder seine Mitglieder anrufen, kann jedoch nichts über A selbst wissen. M kann diese "zirkuläre" oder "viele zu viele" Abhängigkeitsstruktur auflösen, indem sowohl A als auch B von M abhängen.