Java-Entwurfsmuster: Mediator (design pattern)

Heute werfen wir einen Blick auf das nächste Entwurfsmuster (Java design patterns) aus der Kategorie der Verhaltensmuster (Behavioral Patterns) – Mediator. Entwurfsmuster in dieser Kategorie befassen sich mit der Kommunikation(interaction) zwischen Objekten und ihrer Verantwortung (responsibility).

Was ist das Entwurfsmuster Mediator?

Das Entwurfsmuster Mediator wird verwendet, um die Kommunikation zwischen Objekten in einem System zu vereinfachen, indem es einen zentralen Punkt für die Kommunikation zwischen Objekten bereitstellt. Mediator spielt die Rolle eines Vermittlers und sorgt dafür, dass die Objekte nicht direkt miteinander kommunizieren, wodurch das System leicht erweiterbar und wartbar bleibt.

Welches Problem löst das Mediator Entwurfsmuster?

Das Problem, das es löst, ist, dass in komplexen Systemen die Kommunikation zwischen den Objekten komplex und unklar sein kann. Mit der Anzahl der Klassen oder Objekte steigt die Komplexität der Zusammenhänge. Ziel dieses Musters ist es, dass sich die Objekte nicht kennen und somit nicht voneinander abhängig sind und dass die Kommunikation zwischen den Objekten nicht direkt, sondern über einen einzigen Vermittler (Mediator) erfolgt. Dies minimiert die Bindung der Objekte aneinander und erleichtert das Ändern oder Hinzufügen neuer Beziehungen, da die gesamte Kommunikation über einen Vermittler läuft.

Príklad Mediator implementácie v Jave

Wir werden nun demonstrieren, wie das Entwurfsmuster Mediator die Kommunikation zwischen Objekten vereinfachen und unnötige Abhängigkeiten zwischen ihnen beseitigen kann, indem wir einen einfachen Chatroom programmieren, der die Kommunikation zwischen den Teilnehmern einer Diskussion sowohl über öffentliche als auch über private Nachrichten ermöglicht. Mediator.java

package designpatterns;

public interface Mediator {
    void poslatSpravu(Diskuter od, String sprava);
    void poslatSukromnuSpravu(Diskuter odkoho, Diskuter komu, String sprava);
}

Die Mediator-Schnittstelle definiert Methoden zum Senden von Nachrichten an alle Teilnehmer einer Diskussion und zum Senden privater Nachrichten an einen bestimmten Teilnehmer. Chat.java

package designpatterns;

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

public class Chat implements Mediator {
    private List<Diskuter> diskutujuci;

    public Chat() {
        this.diskutujuci = new ArrayList<>();
    }

    public void pridat(Diskuter diskuter) {
        diskutujuci.add(diskuter);
    }

    @Override
    public void poslatSpravu(Diskuter od, String sprava) {
        for(Diskuter prijmatel : diskutujuci) {
            // Poslanie správy všetkým okrem odosielateľa.
            if(prijmatel != od) {
                prijmatel.prijatSpravu(sprava);
            }
        }
    }

    @Override
    public void poslatSukromnuSpravu(Diskuter od, Diskuter komu, String sprava) {
        for(Diskuter prijmatel : diskutujuci) {
            // Poslanie správy konkrétnemu príjmateľovi.
            if(prijmatel == komu) {
                prijmatel.prijatSukromnuSpravu(od, sprava);
            }
        }
    }
}

Die Klasse Chat bietet eine Implementierung der Schnittstelle Mediator. Es enthält eine Liste der Diskutanten und sorgt dafür, dass Nachrichten entweder an alle Teilnehmer oder an bestimmte Personen gesendet werden. Diskuter.java

package designpatterns;

public interface Diskuter {
    void poslatSpravu(String sprava);
    void prijatSpravu(String sprava);
    void poslatSukromnuSpravu(Diskuter komu, String sprava);
    void prijatSukromnuSpravu(Diskuter odkoho, String sprava);
}

Die Diskuter-Schnittstelle definiert Methoden zum Senden und Empfangen von öffentlichen und privaten Nachrichten. Mitglied.java

package designpatterns;

public class Clen implements Diskuter {
    private String meno;
    private Chat chat;

    public Clen(String meno, Chat chat) {
        this.meno = meno;
        this.chat = chat;
        chat.pridat(this);
    }

    @Override
    public void poslatSpravu(String sprava) {
        System.out.println(meno + " posiela správu: " + sprava);
        chat.poslatSpravu(this, sprava);
    }

    @Override
    public void prijatSpravu(String sprava) {
        System.out.println(meno + " prijal/a správu: " + sprava);
    }

    @Override
    public void poslatSukromnuSpravu(Diskuter komu, String sprava) {
        System.out.println(meno + " posiela súkromnú správu: " + sprava);
        chat.poslatSukromnuSpravu(this, komu, sprava);
    }

    @Override
    public void prijatSukromnuSpravu(Diskuter odkoho, String sprava) {
        System.out.println(meno + " prijal/a súkromnú správu: " + sprava);
    }
}

Die Klasse Clen (Member) implementiert die Diskuter-Schnittstelle. Jedes Mitglied hat einen Namen und einen Chat, dem es hinzugefügt wird. Es kann Nachrichten an alle senden, Nachrichten empfangen und private Nachrichten senden. Main.java

import designpatterns.Chat;
import designpatterns.Clen;
import designpatterns.Diskuter;

public class Main {
    public static void main(String[] args) {
        Chat chat = new Chat();
        Diskuter clen1 = new Clen("Jozef", chat);
        Diskuter clen2 = new Clen("Petra", chat);
        Diskuter clen3 = new Clen("Dominik", chat);
        Diskuter clen4 = new Clen("Karolina", chat);
        clen1.poslatSpravu("Ahoj všetci!");
        clen4.poslatSukromnuSpravu(clen1, "Ahoj Jozef!");
        clen3.poslatSpravu("Idete si zahrať stolný futbal?");
        clen1.poslatSpravu("Jasné, prečo nie.");
        clen2.poslatSpravu("Mám prácu, ale jednu si zahrám.");
        clen4.poslatSpravu("Ja sa pridám.");
        clen3.poslatSpravu("Za minútku dole.");
        clen2.poslatSukromnuSpravu(clen1, "Vyklepeme ich ako rezne :-D");
    }
}

Die Klasse Main erstellt ein Chat-Objekt und fügt ihm mehrere Chat-Mitglieder hinzu. Anschließend wird die Funktionalität des Chats demonstriert – die Kommunikation zwischen Mitgliedern, wie das Senden und Empfangen von Nachrichten, einschließlich privater Nachrichten. Zwischen den Objekten (Teilnehmern der Diskussion) gibt es keine direkten Verbindungen, die gesamte Kommunikation erfolgt über den Vermittler – den Chat. Das Hinzufügen neuer Mitglieder zu der Diskussion ist genauso einfach und erhöht nicht die Komplexität der Kommunikation. Die Ausgabe dieses Beispiels ist: Es gibt keine festen Verbindungen zwischen den Objekten (Diskussionsteilnehmern), die gesamte Kommunikation findet über einen Vermittler statt - den Chat.

Zusammenfassung

Das Entwurfsmuster Mediator wird häufig verwendet, wenn wir die Kommunikation und den Nachrichtenaustausch zwischen Objekten durch eine zentralisierte Kommunikation vereinfachen möchten. Die Komplexität des Systems steigt mit der Zunahme der Abhängigkeiten und Beziehungen zwischen den Objekten; dieses Entwurfsmuster hilft, sie erheblich zu reduzieren. Wir haben die Dateien mit dem obigen Beispiel in Form von Code vorbereitet, den du direkt in Java ausführen kannst. Lade den Java Mediator Code hier herunter. Wenn du als Java-Programmierer auf der Suche nach Arbeit bist, informiere dich über unsere Mitarbeiterbenefits und reagiere auf unsere aktuellen Stellenangebote.

Über den Autor

Jozef Wagner

Java Developer Senior

Viac ako 10 rokov programujem v Jave, momentálne pracujem v msg life Slovakia ako Java programátor senior a pomáham zákazníkom implementovať ich požiadavky do poistného softvéru Life Factory. Vo voľnom čase si rád oddýchnem v lese, prípadne si zahrám nejakú dobrú počítačovú hru.

Informieren Sie uns über sich