Ich habe die Viererbande gelesen , um einige meiner Probleme zu lösen, und bin auf das Mediator- Muster gestoßen .
Ich hatte Observer zuvor in meinen Projekten verwendet, um eine GUI-Anwendung zu erstellen. Ich bin etwas verwirrt, da ich keinen großen Unterschied zwischen den beiden finde. Ich habe nach dem Unterschied gesucht, aber keine passende Antwort auf meine Frage gefunden.
Könnte mir jemand helfen, mit einem guten Beispiel zwischen den beiden zu unterscheiden, das die beiden klar abgrenzt?
Programmers.StackExchange
wurde abgelehnt, aber ich habe dort einen ähnlichen Beitrag verfasst, weil ich an der Antwort interessiert war. Vielleicht finden Sie einige der Antworten interessant. :)ChangeManager
für das verwendeteObserver
Muster gibtMediator
. sehen; paginas.fe.up.pt/~aaguiar/as/gof/hires/pat5g.htm#samplecodeAntworten:
Das Beobachtermuster: Definiert eine Eins-zu-Viele-Abhängigkeit zwischen Objekten, sodass alle abhängigen Objekte automatisch benachrichtigt und aktualisiert werden, wenn ein Objekt seinen Status ändert.
Das Mediator-Muster: Definieren Sie ein Objekt, das die Interaktion einer Gruppe von Objekten zusammenfasst. Mediator fördert die lose Kopplung, indem verhindert wird, dass Objekte explizit aufeinander verweisen, und Sie können ihre Interaktion unabhängig voneinander variieren.
Quelle: dofactory
Beispiel:
Das Beobachtermuster: Klasse A kann null oder mehr Beobachter vom Typ O registrieren lassen. Wenn etwas in A geändert wird, werden alle Beobachter benachrichtigt.
Das Mediatormuster: Sie haben einige Instanzen der Klasse X (oder vielleicht sogar mehrere verschiedene Typen: X, Y und Z), und sie möchten miteinander kommunizieren (aber Sie möchten nicht, dass jeder explizite Verweise auf jeden hat other), sodass Sie eine Mediatorklasse M erstellen. Jede Instanz von X hat einen Verweis auf eine gemeinsam genutzte Instanz von M, über die sie mit den anderen Instanzen von X (oder X, Y und Z) kommunizieren kann.
quelle
In dem ursprünglichen Buch, in dem die Begriffe Beobachter und Mediator, Entwurfsmuster, Elemente wiederverwendbarer objektorientierter Software geprägt wurden , heißt es, dass das Mediator-Muster mithilfe des Beobachtermusters implementiert werden kann. Es kann jedoch auch implementiert werden, indem Kollegen (die in etwa den Subjekten des Beobachtermusters entsprechen) entweder auf eine Mediator-Klasse oder eine Mediator-Schnittstelle verweisen.
Es gibt viele Fälle, in denen Sie das Beobachtermuster verwenden möchten. Der Schlüssel ist, dass ein Objekt nicht wissen sollte, welche anderen Objekte seinen Zustand beobachten.
Mediator ist etwas spezifischer, es wird vermieden, dass Klassen direkt kommunizieren, sondern über einen Mediator. Dies unterstützt das Prinzip der Einzelverantwortung, indem die Kommunikation in eine Klasse verlagert werden kann, die nur die Kommunikation übernimmt.
Ein klassisches Mediator-Beispiel ist eine grafische Benutzeroberfläche, in der der naive Ansatz dazu führen kann, dass bei einem Klickereignis mit Schaltflächen ein Code angezeigt wird, der besagt: "Wenn das Foo-Bedienfeld deaktiviert ist und das Balkenbedienfeld die Bezeichnung" Bitte Datum eingeben "trägt, rufen Sie den Server nicht an. Andernfalls machen Sie weiter ", wo mit dem Mediator-Muster steht:" Ich bin nur ein Knopf und habe nichts mit dem Foo-Panel und dem Etikett auf dem Bar-Panel zu tun. Deshalb frage ich meinen Mediator, ob ich den Server anrufe ist jetzt in Ordnung. "
Wenn Mediator mithilfe des Observer-Musters implementiert wird, lautet die Schaltfläche "Hey, Beobachter (einschließlich des Mediators), mein Status hat sich geändert (jemand hat mich angeklickt). Tun Sie etwas dagegen, wenn Sie sich darum kümmern". In meinem Beispiel ist dies wahrscheinlich weniger sinnvoll, als direkt auf den Mediator zu verweisen. In vielen Fällen wäre es jedoch sinnvoll, das Observer-Muster zur Implementierung von Mediator zu verwenden, und der Unterschied zwischen Observer und Mediator ist eher eine Absicht als ein Unterschied im Code selbst.
quelle
Beobachter
1. Ohne
Client1 : Hey Betreff , wann wechselst du?
Client2 : Wann haben Sie den Betreff gewechselt ? Das habe ich nicht bemerkt!
Client3 : Ich weiß, dass sich das Thema geändert hat.
2. Mit
Vermittler
1. Ohne
2. Mit
quelle
Diese Muster werden in verschiedenen Situationen verwendet:
Das Mediatormuster wird verwendet, wenn Sie zwei Subsysteme mit einer gewissen Abhängigkeit haben und eines davon geändert werden muss. Da Sie das vom anderen abhängige System möglicherweise nicht ändern möchten, möchten Sie möglicherweise einen Mediator einführen, der dies tut entkoppeln Sie die Abhängigkeit zwischen ihnen. Auf diese Weise müssen Sie den Mediator nur aktualisieren, wenn sich eines der Subsysteme ändert.
Das Beobachtermuster wird verwendet, wenn eine Klasse anderen Klassen erlauben möchte, sich zu registrieren und Benachrichtigungen über Ereignisse zu erhalten, z. B. ButtonListener usw.
Beide Muster ermöglichen eine geringere Kopplung, sind jedoch sehr unterschiedlich.
quelle
Gehen wir an einem Beispiel vorbei: Stellen Sie sich vor, Sie möchten zwei Anwendungen erstellen:
Vermittler
Wenn Sie die Chat-Anwendung erstellen, wählen Sie das
mediator
Entwurfsmuster aus.Warum werden wir das bevorzugen
mediator
? Schauen Sie sich nur die Definition an:Wie funktioniert die Magie? Zuerst erstellen wir den Chat-Mediator und lassen die Personenobjekte registrieren, sodass er mit jeder einzelnen Person in zwei Richtungen verbunden ist (die Person kann mithilfe des Chat-Mediators eine Nachricht senden, da sie Zugriff darauf hat, und der Chat-Mediator greift darauf zu die empfangene Methode des Personenobjekts, weil er auch Zugriff darauf hat)
Beobachter
Wenn Sie die 911-Anrufanwendung erstellen, wählen Sie das
observer
Entwurfsmuster aus.observer
möchte informiert werden, wenn ein Notfall vorliegt, damit er die Adresse fahren und Hilfe geben kann.observable
Bezug auf jeden einzelnen Krankenwagenobservers
und benachrichtigt ihn, wenn Hilfe benötigt wird (oder ein Ereignis generiert wird).Warum werden wir das bevorzugen
observer
? Schauen Sie sich nur die Definition an:Die Unterschiede:
mediator
verfügt über eine bidirektionale Kommunikation zwischen den Objekten der Person (Senden und Empfangen), wobei der Bedienerobservable
nur über eine bidirektionale Kommunikation verfügt (er weist den Krankenwagen an,observer
zu fahren und zu beenden).mediator
kann dazu führen, dass die Objekte der Person zwischen ihnen interagieren (auch wenn es sich nicht um eine direkte Kommunikation handelt). Der Krankenwagenobservers
registriert sich nur bei den Bedienerereignissenobservable
.mediator
, und auch der Chat enthältmediator
einen Verweis auf jede einzelne Person. Während sich der Krankenwagenobserver
nicht auf den Bediener bezieht, bezieht sichobservable
nur der Bedienerobservable
auf jeden Krankenwagenobserver
.quelle
Obwohl beide für die organisierte Darstellung von Zustandsänderungen verwendet werden, unterscheiden sie sich strukturell und semantisch geringfügig von IMO.
Observer wird verwendet, um eine Statusänderung eines bestimmten Objekts vom Objekt selbst zu übertragen. Die Änderung erfolgt also im zentralen Objekt, das auch für die Signalisierung verantwortlich ist. In Mediator kann die Statusänderung jedoch in jedem Objekt erfolgen, das jedoch von einem Mediator gesendet wird. Es gibt also einen Unterschied im Fluss. Ich glaube jedoch nicht, dass dies unser Codeverhalten beeinflusst. Wir können das eine oder andere verwenden, um das gleiche Verhalten zu erreichen. Andererseits kann dieser Unterschied einige Auswirkungen auf das konzeptionelle Verständnis des Codes haben.
Der Hauptzweck der Verwendung von Mustern besteht darin, eine gemeinsame Sprache zwischen Entwicklern zu erstellen. Wenn ich also einen Mediator sehe, verstehe ich persönlich mehrere Elemente, die versuchen, über einen einzelnen Broker / Hub zu kommunizieren, um Kommunikationsrauschen zu reduzieren (oder SRP zu fördern), und jedes Objekt ist gleichermaßen wichtig für die Fähigkeit, eine Zustandsänderung zu signalisieren. Stellen Sie sich zum Beispiel mehrere Flugzeuge vor, die sich einem Flughafen nähern. Jeder sollte über den Pylon (Mediator) kommunizieren, anstatt miteinander zu kommunizieren. (Denken Sie an 1000 Flugzeuge, die bei der Landung miteinander kommunizieren - das wäre ein Chaos.)
Wenn ich jedoch einen Beobachter sehe, bedeutet dies, dass es einige Statusänderungen gibt, die mir wichtig sein könnten, und ich sollte mich registrieren / abonnieren, um bestimmte Statusänderungen abzuhören. Es gibt ein zentrales Objekt, das für die Signalisierung von Statusänderungen verantwortlich ist. Wenn ich mich beispielsweise auf dem Weg von A nach B um einen bestimmten Flughafen kümmere, kann ich mich an diesem Flughafen registrieren, um einige Ereignisse zu verfolgen, die gesendet werden, beispielsweise wenn eine leere Landebahn oder ähnliches vorhanden ist.
Hoffe es ist klar.
quelle
@cdc erklärte den Unterschied in der Absicht ausgezeichnet.
Ich werde noch ein paar Infos hinzufügen.
Beobachter : Aktiviert die Benachrichtigung eines Ereignisses in einem Objekt an verschiedene Objektgruppen (Instanzen verschiedener Klassen).
Mediator : Zentralisieren Sie die Kommunikation zwischen Objekten, die aus einer bestimmten Klasse erstellt wurden.
Struktur des Mediatormusters aus der Dofabrik :
Mediator : Definiert eine Schnittstelle für die Kommunikation zwischen Kollegen.
Kollege : Ist eine abstrakte Klasse, die die Ereignisse definiert, die zwischen Kollegen kommuniziert werden sollen
ConcreteMediator : Implementiert kooperatives Verhalten durch Koordination von Kollegenobjekten und Pflege seiner Kollegen
ConcreteColleague : Implementiert die über Mediator empfangenen Benachrichtigungsvorgänge , die von anderen Kollegen generiert wurden
Ein Beispiel aus der Praxis:
Sie verwalten ein Computernetzwerk in Mesh- Topologie. Wenn ein neuer Computer hinzugefügt oder ein vorhandener Computer entfernt wird, sollten alle anderen Computer in diesem Netzwerk über diese beiden Ereignisse informiert sein.
Mal sehen, wie das Mediator-Muster hineinpasst.
Code-Auszug:
Ausgabe:
Erläuterung:
quelle
Wie wäre es mit dieser Erklärung? Technisch gesehen sind sowohl Observer als auch Mediator gleich und werden verwendet, um eine entkoppelte Möglichkeit für die Komponentenkommunikation bereitzustellen, aber die Verwendung ist unterschiedlich.
Während abonnierte Komponenten über
obeserver
Statusänderungen informiert werden (z. B. Erstellung eines neuen Datenbankdatensatzes), registrierten diemediator
Befehle Komponenten, um etwas im Zusammenhang mit dem Geschäftslogikfluss zu tun (Senden einer E-Mail an den Benutzer zum Zurücksetzen des Kennworts).Beobachter
Vermittler
quelle