Façade contre Médiateur
j'ai cherché la différence entre ces deux modèles.
je comprends que façade encapsule l'accès à un sous-système et mediator encapsule les interactions entre les composants.
je comprends que les composants du sous-système ne sont pas au courant de la façade, où comme composants sont évidemment au courant du médiateur.
j'utilise actuellement une façade pour encapsuler la méthode de récupération de la configuration information, par exemple App.Configuration, paramétrage utilisateur stocké dans SQL, informations D'assemblage, etc, et un médiateur pour la navigation entre les différentes formes de fenêtres.
cependant, la plupart des sites soulignent que le médiateur "ajoute des fonctionnalités". Que veulent-ils dire par là? Comment médiateur d'ajouter des fonctionnalités?
8 réponses
...la plupart des sites soulignent que le médiateur "ajoute des fonctionnalités"...
la façade expose seulement la fonctionnalité existante d'un point de vue différent.
le mediator "ajoute" la fonctionnalité parce qu'elle combine différentes fonctionnalités existantes pour en créer une nouvelle.
prendre l'exemple suivant::
Vous avez un système de journalisation. À partir de ce système d'enregistrement vous pouvez vous connecter à un fichier, à un support ou à une base de données.
en utilisant le dessin de la façade, vous" cacheriez "toutes les relations de la fonctionnalité existante derrière une seule" interface " celle que la façade expose.
code Client:
Logger logger = new Logger();
logger.initLogger("someLogger");
logger.debug("message");
La mise en œuvre peut impliquer l'interaction de nombreux objets. Mais à la fin, la fonctionnalité existe déjà. Probablement la méthode de "debug" est mise en œuvre comme suit:
mise en Œuvre:
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 );
}
}
la fonctionnalité existe déjà. La façade ne cache. Dans ce cas hypothétique, le LoggerManager gère la création du logger correct, et le LoggerImpl est un objet privé paquet qui a la méthode "debug". De cette façon, la façade n'ajoute pas de fonctionnalité juste en déléguant à certains objets existants.
d'autre part, le médiateur ajoute la nouvelle fonctionnalité en combinant différents objets.
même code Client:
Logger logger = new Logger();
logger.initLogger("someLogger");
logger.debug("message");
mise en Œuvre:
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();
}
}
}
dans ce code, le médiateur est celui qui contient la logique d'affaires pour créer le "canal" approprié pour la journalisation et aussi pour faire la journalisation dans ce canal. Le médiateur "crée" la fonctionnalité.
bien sûr, il y a de meilleures façons de mettre en œuvre ceci en utilisant le polymorphisme, mais le point ici est de montrer comment le médiateur" ajoute " de nouvelles fonctionnalités en combinant les fonctionnalités existantes ( dans mon échantillon n'a pas montré beaucoup de désolé ) mais imaginez le médiateur, lire dans la base de données l'hôte distant où se connecter, puis créer un client et finalement écrire à ce client imprimer le flux de log. De cette façon, le médiateur serait "médiation" entre les différents objets.
enfin, la façade est un motif structurel, c'est-à-dire qu'il décrit la composition des objets, tandis que le médiateur est un comportement, c'est-à-dire qu'il décrit la façon dont les objets interagissent.
j'espère que cela aidera.
j'utilise mediator pour ajouter la fonctionnalité de fichier journal.
ça marche comme ça:
- objA dit au Médiateur qu'il a besoin de faire quelque chose.
- le médiateur envoie le message à différents objets du client.
- Obj B fait la chose dont Obj a besoin, et envoie un message approprié en retour via le médiateur.
- pendant ce temps, Obj C est également envoyé à la fois des messages par le médiateur, et les journaux résultat. De cette façon, nous pouvons obtenir des statistiques d'utilisation des fichiers journaux.
- Obj d pourrait être aussi un vérificateur d'erreurs, de sorte que si Obj B répond que la requête D'Obj a est impossible, Obj d pourrait être la chose qui signale cela à l'utilisateur. Les erreurs peuvent maintenant être enregistrées dans un fichier différent de celui de l'activité régulière, et peuvent utiliser d'autres moyens de se comporter (bip, n'importe quoi) dont L'objet ne devrait pas vraiment se préoccuper.
sous motifs apparentés, gof dit: façade (185) diffère de Mediator en ce qu'il abstrait un sous-système d'objets pour fournir une interface plus commode. Son protocole est unidirectionnel; c'est-à-dire que les objets Facade font des requêtes des classes du sous-système mais pas l'inverse. En revanche, Mediator permet un comportement coopératif que les objets collègues ne fournissent pas ou ne peuvent pas fournir, et le protocole est multidirectionnel.
prendre une analogie simple:
façade: comme un terrain de stationnement, quand l'appel
parkingLot.Out(car1);
mab être une simple chaîne œuvres:
{
car1.StartEngin();
attendant.charge();
car1.driverOut();
}
Médiateur: comme la circulation de la lumière.
il y a des interactions entre la lumière et la voiture,
et les voitures sont contrôlées par l'état.
j'ai pensé que peut-être c'est le médiateur ", ajoute la fonctionnalité"
et à propos de la définition:
Type de façade: structurel
Type de médiateur: comportemental
façade plus préoccupé par les composants étaient contenu dans le interface unifiée ,
et le médiateur concerne comment "1519160920 un" ensemble d'objets interagir .
j'ai pensé que la distinction était directionnelle: la façade est une communication à Sens Unique entre le client et la façade; le Médiateur peut être une conversation bidirectionnelle, avec des messages qui circulent entre le client et le médiateur.
du livre "Design Patterns", la clé du modèle Mediator est décrite comme suit: : "Il (un médiateur) agit comme un HUB de communication pour les widgets (c'est à dire, un" groupe de l'interdépendance des objets)."
en d'autres termes, un objet mediator est le seul superobject qui connaît tous les autres objets d'un groupe d'objets collaboratifs et comment ils devraient interagir entre eux. Tous les autres objets devraient interagir avec l'objet mediator, plutôt que l'un avec l'autre.
en revanche, une façade est une" interface unifiée " pour un ensemble d'interfaces dans un sous - système - à l'usage des consommateurs du sous-système-et non parmi les composants du sous-système.
vous pouvez trouver des détails sur le motif de façade dans cette question SE:
Qu'est-ce que le dessin de la façade?
Facade
fournit une interface simple et unifiée avec un système complexe.
l'exemple du monde Réel ( cleartrip vol+hôtel réservation ) est disponible dans ce post:
Qu'est-ce que le dessin de façade?
Médiateur modèle: Définir un objet qui encapsule la façon dont un ensemble d'objets interagissent. Mediator favorise le couplage lâche en empêchant les objets de se référer explicitement les uns aux autres, et il vous permet de varier leur interaction indépendamment.
Un monde réel exemple de Maillage de la topologie du réseau a été fourni ci-dessous SE question:
Médiateur Vs Observateur Orientée Objet Patrons De Conception
concernant votre requête sur Mediator ajoute responsabilité:
-
façade fournit seulement l'interface aux sous-systèmes existants . Les sous-systèmes existants ne connaissent pas la classe de façade elle-même.
-
Médiateur connaît collègue objets . Il permet la communication entre différents collègues. Dans l'exemple que j'ai cité dans question, ConcreteMediator ( NetworkMediator ) envoie des notifications de registre et d'événement non enregistré d'un collègue à tous les autres collègues.
tous deux imposent une sorte de politique à un autre groupe d'objets. Façade impose la politique d'en haut, et Médiateur impose la politique de ci-dessous. L'utilisation de Façade est visible et contraignante, tandis que l'utilisation de Médiateur est invisible et l'activation.
le façade modèle est utilisé lorsque vous voulez fournir une interface simple et spécifique à un groupe d'objets qui a une interface complexe et générale.
Le Médiateur modèle impose aussi de la politique. Cependant, alors que Facade a imposé sa politique d'une manière visible et contraignante, Mediator impose ses politiques d'une manière cachée et sans contrainte.
Développement Agile de Logiciels, Principes, Modèles et Pratiques de Robert C. Martin.