Suche…


Mediator Musterbeispiel in Java

Das Mediator- Muster definiert ein Objekt (Mediator), das die Interaktion eines Satzes von Objekten kapselt. Es ermöglicht die Kommunikation von vielen zu vielen.

UML-Diagramm:

Mediator-Diagramm

Schlüsselkomponenten:

Mediator: Definiert eine Schnittstelle für die Kommunikation zwischen Kollegen.

Colleague : Ist eine abstrakte Klasse, die die Ereignisse definiert, die zwischen Kollegen kommuniziert werden sollen

ConcreteMediator : Implementiert kooperatives Verhalten durch Koordination von Colleague und Pflege seiner Kollegen

ConcreteColleague : Implementiert die über Mediator empfangenen Benachrichtigungsvorgänge, die von einem anderen Colleague generiert wurden

Ein reales Beispiel:

Sie unterhalten ein Computernetzwerk in Mesh Topologie.

Ein Maschennetz ist eine Netzwerktopologie, in der jeder Knoten Daten für das Netzwerk weiterleitet. Alle Mesh-Knoten arbeiten bei der Verteilung von Daten im Netzwerk zusammen.

Wenn ein neuer Computer hinzugefügt wird oder ein vorhandener Computer entfernt wird, sollten alle anderen Computer in diesem Netzwerk über diese beiden Ereignisse Bescheid wissen.

Mal sehen, wie das Mediator-Muster darin passt.

Code-Auszug:

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);
    }
}

Ausgabe:

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

Erläuterung:

  1. Eagle wird zunächst durch ein register-Ereignis zum Netzwerk hinzugefügt. Keine Benachrichtigungen an andere Kollegen, da Eagle der erste ist.
  2. Wenn dem Netzwerk Ostrich hinzugefügt wird, wird Eagle benachrichtigt: Zeile 1 der Ausgabe wird jetzt gerendert.
  3. Wenn Penguin zum Netzwerk hinzugefügt wird, wurden Eagle und Ostrich benachrichtigt: Zeile 2 und Zeile 3 der Ausgabe werden jetzt gerendert.
  4. Nachdem Eagle das Netzwerk durch Aufheben der Registrierung verlassen hatte, wurden sowohl Ostrich als auch Penguin benachrichtigt. Die Zeilen 4 und 5 der Ausgabe werden jetzt gerendert.


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow