designpatterns/behavioral booknotes

Mediator
‘MEDIATOR’
—Alexander Shvets, “Dive Into Design Patterns”

Objects talk to the mediator, not directly to each other.

aka Intermediary, Controller.
The Mediator Pattern is a behavioral design pattern that defines an object (mediator) to centralize communication between a set of objects (called colleagues), so they don’t communicate directly with each other.

Structure

Code Examples

import java.util.ArrayList;
import java.util.List;
 
// Mediator interface
interface ChatRoomMediator {
    void sendMessage(String message, User user);
}
 
// Concrete Mediator
class ChatRoom implements ChatRoomMediator {
    private List<User> users = new ArrayList<>();
 
    public void addUser(User user) {
        users.add(user);
    }
 
    public void sendMessage(String message, User sender) {
        for (User user : users) {
            if (user != sender) {
                user.receive(message);
            }
        }
    }
}
 
// Colleague (abstract)
abstract class User {
    protected ChatRoomMediator mediator;
    protected String name;
 
    public User(ChatRoomMediator mediator, String name) {
        this.mediator = mediator;
        this.name = name;
    }
 
    public abstract void send(String message);
    public abstract void receive(String message);
}
 
// Concrete Colleague
class ChatUser extends User {
    public ChatUser(ChatRoomMediator mediator, String name) {
        super(mediator, name);
    }
 
    public void send(String message) {
        System.out.println(this.name + " sends: " + message);
        mediator.sendMessage(message, this);
    }
 
    public void receive(String message) {
        System.out.println(this.name + " receives: " + message);
    }
}
 
// Main class to run the demo
public class MediatorPatternDemo {
    public static void main(String[] args) {
        ChatRoom chatRoom = new ChatRoom();
 
        User alice = new ChatUser(chatRoom, "Alice");
        User bob = new ChatUser(chatRoom, "Bob");
        User charlie = new ChatUser(chatRoom, "Charlie");
 
        chatRoom.addUser(alice);
        chatRoom.addUser(bob);
        chatRoom.addUser(charlie);
 
        alice.send("Hello everyone!");
        bob.send("Hey Alice!");
    }
}