Was ist der Unterschied zwischen einer Brücke, einem Mediator und einem Wrapper?


Antworten:


8

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:

  • haben keine formalen Unterscheidungen, auch in der mathematischen Behandlung der Typentheorie
  • sind ohne syntaktische Unterschiede bei der Entwicklung der Typbeziehungen nicht durchsetzbar (der Compiler benötigt etwas zum Durchsetzen)
  • Ändern Sie sich daher mit sich ändernden Anforderungen
  • und sollte nicht gezwungen werden, sich nicht zu ändern, da die Wiederverwendung der Punkt guter Architektur ist

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.


Welche der anderen "Standard" -Muster sind Ihrer Meinung nach ebenfalls Antimuster?
Novellizator

Ich denke, derjenige, der am häufigsten angesprochen wird, ist Singleton. Sie sollten Ihren Objekten niemals eine Semantik aufzwingen (wie nur eine vorhandene Instanz), die nicht erzwungen werden muss (nur einmal instanziieren, wenn Sie dies benötigen). Es wird normalerweise verwendet, um den Zugriff "einfach" zu machen, verschmutzt nur den globalen Raum und verbirgt Abhängigkeitsbeziehungen.
ex0du5

Aber derjenige, der mich wirklich erwischt, wird in GoF nicht gesehen, ist aber ein sehr verbreitetes Muster beim Rechnen: Polling. Das einzige Mal, wenn dies "erforderlich" ist, ist schlecht gestaltete Hardware. Es wird nie für die Softwareüberwachung benötigt, bleibt jedoch aufgrund des schlechten Protokolldesigns, der Faulheit der Benutzeroberfläche usw. bestehen. Man sollte niemals Zeitscheiben verschwenden, ohne zu wissen, dass man etwas Nützliches findet, und das Abrufen hat eine eingebaute Latenz, die in dieser Form selten nützlich ist. Die Latenz kann beim Entprellen von Übergängen hilfreich sein, sollte jedoch erst auftreten, wenn ein Übergang ermittelt wurde. Wir sollten uns bemühen, ereignisgesteuert zu sein.
ex0du5

Wirklich, ich denke wir sollten nicht in Mustern denken, außer als Anerkennung. Ingenieure sollten wirklich nur das entwerfen, was aus ihrer Domänensprache stammt. Von dort kommen die Typen und ihre Beziehungen. Denken Sie dann einfach an eine gute Architektur - Dinge wie das Open / Closed-Prinzip, Wiederverwendung, enthalten statt erben, Vererbung ist für abstrakte Schnittstellenbasen sehr wenige Schichten tief (vorzugsweise nur eine Basis, außer wenn polymorphe Schnittstellen natürlich strukturiert sind), Zustandsmaschinen für staatliche [ereignisgesteuerte] Lebensdauern usw. Dies führt dazu, dass die richtigen Typbeziehungen ausgewählt werden, nicht Muster.
ex0du5

Könnten Sie auf die Forschung hinweisen, dass "gezeigt hat, dass die Struktur wirklich alles ist, was zählt"?
PsiX

6

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).


5

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.