Wzorzec projektowy Mediator jest używany do zmniejszenia skomplikowanej komunikacji i zależności między obiektami w systemie. Pozwala on na centralne zarządzanie interakcjami między obiektami, co ułatwia ich niezależność i ponowne wykorzystanie. W Javie, wzorzec ten można zaimplementować poprzez stworzenie mediatora, który koordynuje komunikację między różnymi klasami.
Przykład użycia wzorca Mediator
W tym przykładzie zaimplementujemy prosty system czatu, w którym różne użytkowniki mogą wysyłać wiadomości do siebie poprzez mediatora.
Klasa Mediator
Najpierw zdefiniujemy interfejs Mediator, który będzie zawierał metodę do wysyłania wiadomości.
// Interfejs mediatora
public interface Mediator {
    void sendMessage(String message, User user);
}
Klasa ChatMediator
Następnie, stworzymy konkretną klasę ChatMediator implementującą Mediator. Ta klasa będzie zarządzać komunikacją między użytkownikami.
import java.util.ArrayList;
import java.util.List;
// Konkretna implementacja mediatora dla czatu
public class ChatMediator implements Mediator {
    private List<User> users;
    public ChatMediator() {
        this.users = new ArrayList<>();
    }
    public void addUser(User user) {
        this.users.add(user);
    }
    @Override
    public void sendMessage(String message, User user) {
        for (User u : users) {
            // Nie wysyłaj wiadomości do użytkownika,
            // który ją wysłał
            if (u != user) {
                u.receive(message);
            }
        }
    }
}
Klasa User
Teraz zdefiniujemy abstrakcyjną klasę User, która będzie reprezentować uczestników czatu.
// Abstrakcyjna klasa użytkownika w systemie czatu
public abstract class User {
    protected Mediator mediator;
    protected String name;
    public User(Mediator mediator, String name) {
        this.mediator = mediator;
        this.name = name;
    }
    public abstract void send(String message);
    public abstract void receive(String message);
}
Klasa ConcreteUser
Na koniec, zaimplementujemy konkretną klasę ConcreteUser, która dziedziczy po User i implementuje metody wysyłania i odbierania wiadomości.
// Konkretna implementacja użytkownika
public class ConcreteUser extends User {
    public ConcreteUser(Mediator mediator, String name) {
        super(mediator, name);
    }
    @Override
    public void send(String message) {
        System.out.println(this.name 
            + ": Wysyłanie wiadomości= " + message);
        mediator.sendMessage(message, this);
    }
    @Override
    public void receive(String message) {
        System.out.println(this.name 
               + ": Otrzymano wiadomość= " + message);
    }
}
Użycie Mediatora
Wreszcie, zobaczmy, jak użyć naszego mediatora do komunikacji między użytkownikami.
public class ChatClient {
    public static void main(String[] args) {
        ChatMediator mediator = new ChatMediator();
        User user1 = new ConcreteUser(mediator, "Jan");
        User user2 = new ConcreteUser(mediator, "Anna");
        User user3 = new ConcreteUser(mediator, "Piotr");
        mediator.addUser(user1);
        mediator.addUser(user2);
        mediator.addUser(user3);
        user1.send("Cześć wszystkim!");
    }
}
Podsumowanie
Wzorzec Mediator w Javie ułatwia zarządzanie komunikacją między różnymi obiektami, zmniejszając ich bezpośrednie zależności. W naszym przykładzie, mediator ChatMediator umożliwiał bezpośrednią komunikację między użytkownikami czatu, ConcreteUser,
Jeżeli chcesz przyśpieszyć swoją naukę tworzenia stron chciałbym polecić mój kurs video Java w którym nauczysz się tego języka od podstaw do zaawansowanych jego aspektów.
