Le modèle de conception du médiateur est l’un des modèles de conception comportementale, il traite donc des comportements des objets. Le modèle de conception du médiateur est utilisé pour fournir un moyen de communication centralisé entre différents objets dans un système.
Modèle de conception du médiateur
Selon GoF, l’intention du modèle de médiateur est :
Permet un couplage lâche en encapsulant la manière dont des ensembles disparates d’objets interagissent et communiquent entre eux. Permet aux actions de chaque ensemble d’objets de varier indépendamment les unes des autres.
Le modèle de conception du médiateur est très utile dans une application d’entreprise où plusieurs objets interagissent les uns avec les autres. Si les objets interagissent directement les uns avec les autres, les composants du système sont étroitement couplés entre eux, ce qui entraîne un coût de maintenance plus élevé et une difficulté d’extension. Le modèle de médiateur se concentre sur la fourniture d’un médiateur entre les objets pour la communication et aide à mettre en œuvre un découplage entre les objets. Le contrôleur de trafic aérien est un excellent exemple du modèle de médiateur, où la salle de contrôle de l’aéroport agit comme médiateur pour la communication entre les différents vols. Le médiateur agit comme un routeur entre les objets et peut avoir sa propre logique pour fournir un moyen de communication. Les objets système qui communiquent les uns avec les autres sont appelés collègues. Habituellement, nous avons une interface ou une classe abstraite qui définit le contrat de communication, puis nous avons une implémentation concrète des médiateurs. Pour notre exemple, nous allons essayer de mettre en œuvre une application de chat où les utilisateurs peuvent discuter en groupe. Chaque utilisateur sera identifié par son nom et pourra envoyer et recevoir des messages. Le message envoyé par un utilisateur doit être reçu par tous les autres utilisateurs du groupe.
Interface du modèle de médiateur
Tout d’abord, nous allons créer une interface de médiateur qui définira le contrat pour les médiateurs concrets. ChatMediator.java
package com.journaldev.design.mediator;
public interface ChatMediator {
public void sendMessage(String msg, User user);
void addUser(User user);
}
Modèle de médiateur Interface collègue
Les utilisateurs peuvent envoyer et recevoir des messages, donc nous pouvons avoir une interface utilisateur ou une classe abstraite. Je crée l’utilisateur comme une classe abstraite comme ci-dessous. User.java
package com.journaldev.design.mediator;
public abstract class User {
protected ChatMediator mediator;
protected String name;
public User(ChatMediator med, String name){
this.mediator=med;
this.name=name;
}
public abstract void send(String msg);
public abstract void receive(String msg);
}
Remarquez que l’utilisateur a une référence à l’objet médiateur, cela est nécessaire pour la communication entre différents utilisateurs.
Médiateur concret
Maintenant, nous allons créer une classe médiateur concrète, elle aura une liste d’utilisateurs dans le groupe et fournira la logique pour la communication entre les utilisateurs. ChatMediatorImpl.java
package com.journaldev.design.mediator;
import java.util.ArrayList;
import java.util.List;
public class ChatMediatorImpl implements ChatMediator {
private List users;
public ChatMediatorImpl(){
this.users=new ArrayList<>();
}
@Override
public void addUser(User user){
this.users.add(user);
}
@Override
public void sendMessage(String msg, User user) {
for(User u : this.users){
// le message ne doit pas être reçu par l'utilisateur qui l'envoie
if(u != user){
u.receive(msg);
}
}
}
}
Modèle de conception du médiateur Collègue concret
Maintenant, nous pouvons créer des classes d’utilisateurs concrètes à utiliser par le système client. UserImpl.java
package com.journaldev.design.mediator;
public class UserImpl extends User {
public UserImpl(ChatMediator med, String name) {
super(med, name);
}
@Override
public void send(String msg){
System.out.println(this.name+": Sending Message="+msg);
mediator.sendMessage(msg, this);
}
@Override
public void receive(String msg) {
System.out.println(this.name+": Received Message:"+msg);
}
}
Remarquez que la méthode send() utilise le médiateur pour envoyer le message aux utilisateurs et n’a aucune idée de la manière dont il sera géré par le médiateur.
Exemple de code de programme client du modèle de conception Médiateur
Testons notre application de chat avec un programme simple où nous allons créer un médiateur, ajouter des utilisateurs au groupe et l’un des utilisateurs enverra un message. ChatClient.java
package com.journaldev.design.mediator;
public class ChatClient {
public static void main(String[] args) {
ChatMediator mediator = new ChatMediatorImpl();
User user1 = new UserImpl(mediator, "Pankaj");
User user2 = new UserImpl(mediator, "Lisa");
User user3 = new UserImpl(mediator, "Saurabh");
User user4 = new UserImpl(mediator, "David");
mediator.addUser(user1);
mediator.addUser(user2);
mediator.addUser(user3);
mediator.addUser(user4);
user1.send("Hi All");
}
}
Remarquez que le programme client est très simple et n’a aucune idée de la manière dont le message est géré et si le médiateur reçoit l’utilisateur ou non. La sortie du programme exemple du modèle de conception Médiateur est :
Pankaj: Sending Message=Hi All
Lisa: Received Message:Hi All
Saurabh: Received Message:Hi All
David: Received Message:Hi All
Diagramme de classes du modèle de conception Médiateur
Exemple du modèle de conception Médiateur dans JDK
- La classe java.util.Timer comporte des méthodes scheduleXXX()
- L’exécuteur de la concurrence Java comporte la méthode execute().
- La méthode invoke() de la classe java.lang.reflect.Method.
Points Importants du Modèle de Conception Médiateur
- Le modèle de conception Médiateur est utile lorsque la logique de communication entre les objets est complexe, nous pouvons avoir un point central de communication qui gère la logique de communication.
- Java Message Service (JMS) utilise le modèle Médiateur ainsi que le modèle Observateur pour permettre aux applications de s’abonner et de publier des données vers d’autres applications.
- Nous ne devrions pas utiliser le modèle Médiateur uniquement pour obtenir un faible couplage car si le nombre de médiateurs augmente, il deviendra difficile de les maintenir.
C’est tout pour le modèle de conception Médiateur et son implémentation en Java.
Source:
https://www.digitalocean.com/community/tutorials/mediator-design-pattern-java