Recherche…


Exemple de modèle de médiateur en Java

Le modèle de médiateur définit un objet (Mediator) qui encapsule la manière dont un ensemble d'objets interagit. Il permet une communication plusieurs à plusieurs.

Diagramme UML:

Schéma du médiateur

Composants clés:

Mediator: Définit une interface pour la communication entre collègues.

Colleague : est un cours abstrait, qui définit les événements à communiquer entre collègues.

ConcreteMediator : ConcreteMediator œuvre un comportement coopératif en coordonnant les objets Colleague et maintient ses collègues

ConcreteColleague : Implémente les opérations de notification reçues via Mediator , qui ont été générées par d'autres Colleague

Un exemple concret:

Vous gérez un réseau d'ordinateurs dans la topologie Mesh .

Un réseau maillé est une topologie de réseau dans laquelle chaque nœud relaie des données pour le réseau. Tous les nœuds de maillage coopèrent dans la distribution des données dans le réseau.

Si un nouvel ordinateur est ajouté ou si l'ordinateur existant est supprimé, tous les autres ordinateurs de ce réseau doivent connaître ces deux événements.

Voyons comment le motif Mediator s'y intègre.

Extrait de code:

import java.util.List;
import java.util.ArrayList;

/* Define the contract for communication between Colleagues. 
   Implementation is left to ConcreteMediator */
interface Mediator{
    void register(Colleague colleague);
    void unregister(Colleague colleague);
}
/* Define the contract for notification events from Mediator. 
   Implementation is left to ConcreteColleague
*/
abstract class Colleague{
    private Mediator mediator;
    private String name;
    
    public Colleague(Mediator mediator,String name){
        this.mediator = mediator;
        this.name = name;
    }
    public String toString(){
        return name;
    }
    public abstract void receiveRegisterNotification(Colleague colleague);
    public abstract void receiveUnRegisterNotification(Colleague colleague);    
}
/*  Process notification event raised by other Colleague through Mediator.   
*/
class ComputerColleague extends Colleague {
    private Mediator mediator;
    
    public ComputerColleague(Mediator mediator,String name){
        super(mediator,name);
    }
    public  void receiveRegisterNotification(Colleague colleague){
        System.out.println("New Computer register event with name:"+colleague+
        ": received @"+this);
        // Send further messages to this new Colleague from now onwards
    }
    public  void receiveUnRegisterNotification(Colleague colleague){
        System.out.println("Computer left unregister event with name:"+colleague+
        ":received @"+this);
        // Do not send further messages to this Colleague from now onwards
    }
}
/* Act as a central hub for communication between different Colleagues. 
   Notifies all Concrete Colleagues on occurrence of an event
*/
class NetworkMediator implements Mediator{
    List<Colleague> colleagues = new ArrayList<Colleague>();
    
    public NetworkMediator(){
    
    }
    
    public void register(Colleague colleague){
        colleagues.add(colleague);
        for (Colleague other : colleagues){
            if ( other != colleague){
                other.receiveRegisterNotification(colleague);
            }
        }
    }
    public void unregister(Colleague colleague){
        colleagues.remove(colleague);
        for (Colleague other : colleagues){
            other.receiveUnRegisterNotification(colleague);
        }
    }
}

public class MediatorPatternDemo{
    public static void main(String args[]){
        Mediator mediator = new NetworkMediator();
        ComputerColleague colleague1 = new ComputerColleague(mediator,"Eagle");
        ComputerColleague colleague2 = new ComputerColleague(mediator,"Ostrich");
        ComputerColleague colleague3 = new ComputerColleague(mediator,"Penguin");
        mediator.register(colleague1);
        mediator.register(colleague2);
        mediator.register(colleague3);
        mediator.unregister(colleague1);
    }
}

sortie:

New Computer register event with name:Ostrich: received @Eagle
New Computer register event with name:Penguin: received @Eagle
New Computer register event with name:Penguin: received @Ostrich
Computer left unregister event with name:Eagle:received @Ostrich
Computer left unregister event with name:Eagle:received @Penguin

Explication:

  1. Eagle est ajouté au réseau lors du premier événement de registre. Aucune notification à d'autres collègues puisque Eagle est le premier.
  2. Lorsque l' Ostrich est ajoutée au réseau, Eagle est averti: la ligne 1 de la sortie est rendue maintenant.
  3. Lorsque Penguin est ajouté au réseau, Eagle et Ostrich ont été notifiés: les lignes 2 et 3 de la sortie sont maintenant affichées.
  4. Lorsque Eagle quitté le réseau par le biais d'un événement de désinscription, l' Ostrich et le Penguin ont été notifiés. Les lignes 4 et 5 de la sortie sont maintenant affichées.


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow