Frage

Ich habe den Unterschied zwischen diesen beiden Mustern erforscht.

Ich verstehe, dass Fassade Zugang zu einem Untersystem kapselt und Vermittler kapselt die Wechselwirkungen zwischen den Komponenten.

Ich verstehe, dass Untersystemkomponenten sind sich nicht bewusst von der Fassade, wo als Komponenten offensichtlich bewusst des Mediators sind.

Ich bin derzeit eine Fassade zum Einkapseln des Verfahrens Konfigurationsinformationen zum Abrufen, z.B. App.Config, Benutzereinstellung gespeichert in SQL, Assembly Info, etc, und ein Mediator für die Navigation zwischen verschiedenen Fenstern bilden.

Allerdings sind die meisten Websites weisen darauf hin, dass der Mediator „fügt Funktionalität“. Was bedeuten sie dies? Wie funktioniert Mediator Funktionalität hinzufügen?

War es hilfreich?

Lösung

  

... die meisten Websites weisen darauf hin, dass der Mediator „fügt Funktionalität“ ...

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

Die Vermittler „ergänzen“ Funktionalität, weil es unterschiedliche vorhandene Funktionalität kombiniert, einen neuen zu erstellen.

Nehmen Sie das folgende Beispiel:

Sie haben ein Logging-System. Von diesem Logging-System können Sie entweder melden Sie sich in einer Datei, an eine Steckdose oder an eine Datenbank.

Mit der Fassadengestaltung Muster würden Sie „verstecken“ alle Beziehungen aus bestehenden Funktionalität hinter einer einzigen „Schnittstelle“ der, die die Fassade aussetzt.

Client-Code:

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

Die Implementierung kann die Interaktion vieler Objekte beinhalten. Aber am Ende besteht die Funktionalität bereits. Wahrscheinlich Methode der „debug“ implementiert ist wie folgt:

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 bereits vorhanden sein. Die Fassade nur versteckt es. In diesem hypothetischen Fall behandelt der LoggerManager die Schaffung des richtigen Logger und das LoggerImpl ist ein Paket Privat Objekt, das die „debug“ Methode hat. Auf diese Weise wird die Fassade nicht Funktionalität hinzugefügt wird, nur um einige bestehende Objekte zu delegieren.

In der anderen Hand nimmt der Mediator die neue Funktionalität durch verschiedene Objekte zu kombinieren.

Samen 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 Vermittler denjenigen, der die Geschäftslogik enthält den entsprechenden „Kanal“ zu schaffen, um sie einzuloggen und auch das Protokoll in diesen Kanal zu machen. Der Mediator wird die Funktionalität "Erstellen".

Natürlich gibt es bessere Möglichkeiten, diese mit Polymorphismus zu implementieren, aber der Punkt ist, zu zeigen, wie der Mediator „ergänzt“ neue Funktionalität von vorhandener Funktionalität kombiniert (in meinem Beispiel nicht zeigte sehr traurig) aber vorstellen, dass die Vermittler, lesen Sie aus der Datenbank des Remote-Host, wo man sich einzuloggen, dann ein Client erstellt und schließlich zu diesem Client-Druck schreiben die Protokollnachricht streamen. Auf diese Weise der Mediator würde „Vermittlung“ zwischen den verschiedenen Objekten sein.

Schließlich ist die Fassade ist ein Strukturmuster, das ist es, die Zusammensetzung der Objekte beschreibt, während die Vermittler ist ein Verhalten, das heißt, es die Art und Weise beschreibt, die Objekte in Wechselwirkung treten.

Ich hoffe, das hilft.

Andere Tipps

Ich bin mit Mediator Protokolldatei Funktionalität hinzuzufügen.

Es funktioniert wie folgt:

  • Obj A sagt dem Vermittler braucht es etwas getan.
  • Der Mediator sendet die Nachricht an verschiedene Client-Objekte.
  • Obj B tut das Ding Obj A benötigt, und sendet eine entsprechende Nachricht über den Vermittler zurück.
  • Inzwischen Obj C auch gesendet beide Nachrichten vom Vermittler und protokolliert die Ergebnisse. Auf diese Weise können wir User-Statistik aus den Log-Dateien erhalten.
  • Obj D ein Fehler Prüfung als auch sein könnte, so dass, wenn Obj B antwortet, dass Obj A Anforderung unmöglich ist, Obj D die Sache, dass dem Benutzer berichtet werden könnte. Fehler können nun in einer anderen Datei als normale Aktivität protokolliert werden, und einige andere Mittel nutzen könnten verhalten (Piepen, was auch immer), dass Obj A sollte sich nicht wirklich betreffen mit.

unter ähnlichen Muster, gof sagt: Fassade (185) von Mediator unterscheidet sich darin, dass es ein Teilsystem von Objekten abstrahiert zu bietet eine komfortable Schnittstelle. Sein Protokoll ist unidirektional; das heißt, Fassade Objekte Anfragen in den Subsystemklassen, aber nicht umgekehrt. Im Gegensatz dazu ermöglicht Mediator kooperatives Verhalten, dass Kollegen Objekte nicht oder nicht zur Verfügung stellen können, und das Protokoll ist multidirektionale.

Nehmen Sie

eine einfache Analogie:

Fassade: wie ein Parkplatz, wenn Anruf

parkingLot.Out(car1);

mab eine einfache Kette Werke sein:

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

Mediator:. Wie Ampel

Es gibt Wechselwirkungen zwischen Licht und Auto,

und Autos werden durch sie Zustand ist.

ich aber vielleicht ist dies die Vermittler „fügt Funktionalität“


Und über die Definition:

Fassadentyp: Structural

Mediators Typ: Behavioral

Fassade mehr besorgt über die Komponenten waren enthalten in der einheitliche Schnittstelle ,

und Vermittler Sorge wie eine Reihe von Objekten interact .

Ich dachte, der Unterschied war Richt: Fassade ist eine Ein-Wege-Kommunikation zwischen Client und Fassade; Mediator kann ein Zwei-Wege-Gespräch sein, mit Nachrichten fließen hin und her zwischen dem Kunden und Vermittlern.

Von dem „Design Patterns“ Buch, der Schlüssel des Mediator-Musters wird wie folgt beschrieben: "Es (a Mediator) wirkt als HUB der Verbindung für die widgets (d.h. 'a' Gruppe von untereinander abhängigen Objekten)."

Mit anderen Worten, ein Mediator-Objekt ist das einzige superobject, das alle anderen Objekte in einer Gruppe von Objekten zusammen kennt und wie sie miteinander interagieren sollen. Alle andere Objekte mit dem Mediator Objekt interagieren sollen, statt miteinander.

Im Gegensatz dazu eine Fassade ist eine „einheitliche Schnittstelle“ für eine Reihe von Schnittstellen in einem Subsystem - für die Nutzung durch die Verbraucher des Subsystems -. Nicht unter den Komponenten des Subsystems

Hier finden Sie Informationen über Fassadenmuster in dieser SE Frage:

Was ist Facade Design-Muster?

Facade bietet eine einfache und einheitliche Schnittstelle zu komplexem System.

Ein echtes Beispiel ( Clear Flug + Hotel buchen ) in diesem Beitrag nicht vorhanden ist:

Was ist Facade Design-Muster?

Mediator Muster: Definieren Sie ein Objekt, das verkapselt, wie eine Reihe von Objekten interagieren. Mediator fördert lose Kopplung explizit zueinander zu halten Objekte Bezug genommen wird, und es können Sie variieren ihre Interaktion unabhängig.

Ein Beispiel aus der Praxis von Mesh-Netzwerktopologie ist unter SE Frage zur Verfügung gestellt in worden:

Mediator Vs Observer Objektorientiertes Design Patterns

In Bezug auf Ihre Anfrage auf Mediator fügt Verantwortung:

  1. Fassade bietet nur Schnittstelle zu bestehenden Teilsysteme . Bestehende Teilsysteme sind nicht bekannt, Fassadenklasse selbst.

  2. Mediator kennt Kollegen Objekte . Es ermöglicht die Kommunikation zwischen den verschiedenen Kollegen. Im Beispiel, das ich in verknüpften Frage zitiert haben, ConcreteMediator ( NetworkMediator ) sendet Benachrichtigungen von Register- und deregistrieren Fall eines Kollegen zu allen anderen Kollegen.

Sowohl eine Art von Politik auf eine andere Gruppe von Objekten verhängen. Fassade erlegt die Politik von oben, und Mediator legt die Politik von unten. Die Verwendung von Fassade ist sichtbar und Zwang, während die Verwendung von Mediator ist unsichtbar und ermöglicht wird.

Die Fassade Muster verwendet, wenn Sie eine einfache und spezifische Schnittstelle zu einer Gruppe von Objekten zur Verfügung stellen mögen, die eine komplexe und allgemeine Schnittstelle hat.

Die Mediator Muster erlegt auch Politik. Während jedoch die Fassade ihre Politik in einer sichtbaren und Zwang Art und Weise auferlegt, Mediator legt ihre Politik in einer versteckten und ungezwungenen Art und Weise.

Agile Softwareentwicklung, Grundsätze, Muster und Praktiken Robert C. Martin.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top