Fassade gegen Vermittler


83

Ich habe den Unterschied zwischen diesen beiden Mustern untersucht.

Ich verstehe, dass die Fassade den Zugriff auf ein Subsystem und der Mediator die Interaktionen zwischen Komponenten kapselt.

Ich verstehe, dass Subsystemkomponenten die Fassade nicht kennen, während Komponenten offensichtlich den Mediator kennen.

Ich verwende derzeit eine Fassade zum Einkapseln der Methode zum Abrufen von Konfigurationsinformationen, z. B. App.Config, in SQL gespeicherte Benutzereinstellungen, Assembly-Informationen usw. und einen Mediator für die Navigation zwischen verschiedenen Windows-Formularen.

Die meisten Websites weisen jedoch darauf hin, dass der Mediator „Funktionen hinzufügt“. Was meinen sie damit? Wie fügt der Mediator Funktionen hinzu?

Antworten:


103

... die meisten Websites weisen darauf hin, dass der Mediator "Funktionalität hinzufügt" ...

Die Fassade zeigt die vorhandene Funktionalität nur aus einer anderen Perspektive.

Der Mediator "fügt" Funktionen hinzu, da er verschiedene vorhandene Funktionen kombiniert, um eine neue zu erstellen.

Nehmen Sie das folgende Beispiel:

Sie haben ein Protokollierungssystem. Von diesem Protokollierungssystem aus können Sie entweder in einer Datei, in einem Socket oder in einer Datenbank protokollieren.

Mit dem Fassadenentwurfsmuster würden Sie alle Beziehungen vor vorhandenen Funktionen hinter einer einzigen "Schnittstelle" "verbergen", die die Fassade freigibt.

Kundencode:

 Logger logger = new Logger();
 logger.initLogger("someLogger");
 logger.debug("message");

Die Implementierung kann die Interaktion vieler Objekte beinhalten. Aber am Ende ist die Funktionalität bereits vorhanden. Wahrscheinlich ist die "Debug" -Methode wie folgt implementiert:

Implementierung:

 class Logger { 

      private LoggerImpl internalLogger;
      private LoggerManager manager;

      public void initLogger( String loggerName ) {
          this.internalLogger = manager.getLogger( loggerName ); 
      }

      public void debug( String message ) { 
          this.internalLogger.debug( message );
      }     
 }

Die Funktionalität ist bereits vorhanden. Die Fassade verbirgt es nur. In diesem hypothetischen Fall übernimmt der LoggerManager die Erstellung des richtigen Loggers, und der LoggerImpl ist ein paketprivates Objekt mit der Methode "debug". Auf diese Weise fügt die Fassade keine Funktionen hinzu, sondern delegiert sie nur an einige vorhandene Objekte.

Andererseits fügt der Mediator neue Funktionen hinzu, indem er verschiedene Objekte kombiniert.

Gleicher Client-Code:

 Logger logger = new Logger();
 logger.initLogger("someLogger");
 logger.debug("message");

Implementierung:

 class Logger { 

      private java.io.PrintStream out;
      private java.net.Socket client;
      private java.sql.Connection dbConnection;
      private String loggerName;


      public void initLogger( String loggerName ) {
               this.loggerName = loggerName;
               if ( loggerName == "someLogger" ) { 
                    out = new PrintStream( new File("app.log"));
               } else if ( loggerName == "serverLog" ) { 
                    client = new Socket("127.0.0.1", 1234 );
               } else if( loggerName == "dblog") { 
                    dbConnection = Class.forName()... .
               }

      }

      public void debug( String message ) { 

               if ( loggerName == "someLogger" ) { 
                    out.println( message );
               } else if ( loggerName == "serverLog" ) { 
                    ObjectOutputStrewam oos = 
                           new ObjectOutputStrewam( client.getOutputStream());
                    oos.writeObject( message );
               } else if( loggerName == "dblog") { 
                    Pstmt pstmt = dbConnection.prepareStatment( LOG_SQL );
                    pstmt.setParameter(1, message );
                    pstmt.executeUpdate();
                    dbConnection.commit();
               }
      }
 }

In diesem Code ist der Mediator derjenige, der die Geschäftslogik enthält, um einen geeigneten "Kanal" zum Protokollieren zu erstellen und das Protokoll auch in diesem Kanal zu erstellen. Der Mediator "erstellt" die Funktionalität.

Natürlich gibt es bessere Möglichkeiten, dies mithilfe von Polymorphismus zu implementieren, aber hier geht es darum zu zeigen, wie der Mediator neue Funktionen "hinzufügt", indem er vorhandene Funktionen kombiniert (in meinem Beispiel hat es nicht sehr leid getan), aber stellen Sie sich den Mediator vor, lesen Sie Aus der Datenbank erstellt der Remote-Host, auf dem protokolliert werden soll, einen Client und schreibt schließlich die Protokollnachricht in diesen Client-Druckstrom. Auf diese Weise würde der Mediator zwischen den verschiedenen Objekten "vermitteln".

Schließlich ist die Fassade ein Strukturmuster, dh sie beschreibt die Zusammensetzung der Objekte, während der Mediator ein Verhalten ist, dh die Art und Weise, wie die Objekte interagieren.

Ich hoffe das hilft.


Tolle Erklärung. Ich habe eine Frage dazu. Passt die Art und Weise, wie ReentrantLock und AbstractQueueSynchronizer (AQS) zusammengesetzt sind, zum Beispiel eines Fassadenmusters? Ich meine, ReentrantLock macht nur die Funktionalität von AQS verfügbar, die darin als Subsystem vorhanden ist.
AKS

Widerspricht die Antwort von @RayTayek Ihrer Antwort? Das Protokoll Ihres Mediators ist unidirektional, oder?
Narek

Ich konnte keine Website (einschließlich Wikipedia) finden, die besagt, dass ein Mediator neue Funktionen hinzufügt. Können Sie einige Referenzen angeben?
Entwickler

@ Entwickler hier ist eine Referenz , siehe unten.
Dario Fumagalli

13

Ich verwende Mediator, um Protokolldateifunktionen hinzuzufügen.

Es funktioniert so:

  • Obj A sagt dem Mediator, dass etwas getan werden muss.
  • Der Mediator sendet die Nachricht an verschiedene Clientobjekte.
  • Obj B macht das, was Obj A braucht, und sendet eine entsprechende Nachricht über den Mediator zurück.
  • In der Zwischenzeit sendet Obj C auch beide Nachrichten vom Mediator und protokolliert die Ergebnisse. Auf diese Weise können wir Benutzerstatistiken aus den Protokolldateien abrufen.
  • Obj D könnte auch eine Fehlerprüfung sein. Wenn also Obj B antwortet, dass die Anfrage von Obj A unmöglich ist, könnte Obj D das sein, was dies dem Benutzer meldet. Fehler können jetzt in einer anderen Datei als bei normalen Aktivitäten protokolliert werden und andere Methoden verwenden, um sich zu verhalten (Piepen, was auch immer), mit denen sich Obj A eigentlich nicht befassen sollte.

11

unter verwandten Mustern sagt gof : Facade (185) unterscheidet sich von Mediator darin, dass es ein Subsystem von Objekten abstrahiert, um eine bequemere Schnittstelle bereitzustellen. Sein Protokoll ist unidirektional; Das heißt, Facade-Objekte stellen Anforderungen an die Subsystemklassen, aber nicht umgekehrt. Im Gegensatz dazu ermöglicht Mediator kooperatives Verhalten, das Kollegenobjekte nicht bereitstellen oder nicht bereitstellen können, und das Protokoll ist multidirektional.


7

Nehmen Sie eine einfache Analogie:

Fassade: wie ein Parkplatz, wenn angerufen

parkingLot.Out(car1);

mab eine einfache Kette funktioniert:

{
  car1.StartEngin();      
  attendant.charge();
  car1.driverOut();
}

Mediator: wie eine Ampel.

Es gibt Wechselwirkungen zwischen Licht und Auto,

und Autos werden von seinem Zustand kontrolliert.

Ich denke, vielleicht ist dies der Mediator, der "Funktionalität hinzufügt".


Und zur Definition:

Fassadentyp: Strukturell

Mediatortyp: Verhalten

Fassade mehr besorgt über die Komponenten wurden enthalten in der einheitlichen Schnittstelle ,

und Mediator betreffen, wie eine Reihe von Objekten interagieren .


4

Ich dachte, die Unterscheidung sei richtungsweisend: Fassade ist eine einseitige Kommunikation zwischen Kunde und Fassade; Mediator kann eine wechselseitige Konversation sein, bei der Nachrichten zwischen dem Klienten und dem Mediator hin und her fließen.


Entschuldigung, aber dieser Unterschied ist tatsächlich falsch. Die Antwort von mmr ist richtig. Obwohl ich auch das gleiche geglaubt habe wie Sie, als ich sie zum ersten Mal ansah
Robert Gould

3

Aus dem Buch "Design Patterns" wird der Schlüssel des Mediator-Musters wie folgt beschrieben: "Es (ein Mediator) fungiert als Kommunikationsknoten für Widgets (dh eine Gruppe von voneinander abhängigen Objekten)."

Mit anderen Worten, ein Mediatorobjekt ist das einzige Superobjekt, das alle anderen Objekte in einer Gruppe von zusammenarbeitenden Objekten kennt und weiß, wie sie miteinander interagieren sollen. Alle anderen Objekte sollten nicht miteinander, sondern mit dem Mediatorobjekt interagieren.

Im Gegensatz dazu ist eine Fassade eine "einheitliche Schnittstelle" für eine Reihe von Schnittstellen in einem Subsystem - zur Verwendung durch Verbraucher des Subsystems - nicht unter den Komponenten des Subsystems.


1

Details zum Fassadenmuster finden Sie in dieser SE-Frage:

Was ist ein Fassadenmuster?

Facade bietet eine einfache und einheitliche Schnittstelle zu komplexen Systemen.

Ein Beispiel aus der Praxis ( Cleartrip-Flug + Hotelbuchung ) finden Sie in diesem Beitrag:

Was ist ein Fassadenmuster?

Mediatormuster : 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.

Ein Beispiel aus der Praxis für die Mesh-Netzwerktopologie finden Sie in der folgenden SE-Frage:

Mediator Vs Observer Objektorientierte Entwurfsmuster

In Bezug auf Ihre Anfrage zu Mediator wird die Verantwortung hinzugefügt:

  1. Facade bietet nur eine Schnittstelle zu vorhandenen Subsystemen . Bestehende Subsysteme kennen die Facade-Klasse selbst nicht.

  2. Der Mediator kennt sich mit Kollegenobjekten aus . Es ermöglicht die Kommunikation zwischen verschiedenen Kollegen. In dem Beispiel, das ich in der verknüpften Frage zitiert habe, sendet ConcreteMediator ( NetworkMediator ) Benachrichtigungen über das Registrieren und Aufheben der Registrierung eines Ereignisses eines Kollegen an alle anderen Kollegen.


1

Beide legen einer anderen Gruppe von Objekten eine Art Richtlinie auf. Facade legt die Richtlinie von oben fest, und Mediator legt die Richtlinie von unten fest. Die Verwendung von Facade ist sichtbar und einschränkend, während die Verwendung von Mediator unsichtbar und aktivierend ist.

Das Fassadenmuster wird verwendet, wenn Sie eine einfache und spezifische Schnittstelle für eine Gruppe von Objekten bereitstellen möchten, die über eine komplexe und allgemeine Schnittstelle verfügt.

Das Mediator- Muster schreibt auch Richtlinien vor. Während Facade seine Richtlinien auf sichtbare und einschränkende Weise auferlegte , setzt Mediator seine Richtlinien auf versteckte und uneingeschränkte Weise durch.

Agile Softwareentwicklung, Prinzipien, Muster und Praktiken Robert C. Martin.

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.