DEV Community

DevCorner2
DevCorner2

Posted on

๐Ÿงญ Mediator Design Pattern โ€“ Java LLD + UML + Real Use Case

Decouple complex object interactions by introducing a mediator โ€” promoting loose coupling, centralized control, and modularity in communication-heavy systems.


๐Ÿง  What is the Mediator Pattern?

The Mediator Pattern is a behavioral design pattern that defines an object (Mediator) that encapsulates how a set of objects interact.

Instead of objects referring to each other directly, they communicate via a central mediator object.


๐Ÿงฉ Motivation

Problem Mediator Solves
Many-to-many communication between components Introduces centralized coordination
Strong coupling between classes Promotes loose coupling
Hard-to-maintain interdependent code Simplifies interaction logic

โœ… Real-World Use Cases

Use Case Description
๐Ÿ“จ Chatroom App Users send messages via a central chatroom mediator
๐Ÿ›ฌ Air Traffic Control Flights communicate via control tower (mediator)
๐Ÿ’ฌ UI Form Field Coordination Fields affect each other via mediator (e.g., enable/disable)
๐ŸŽฎ Game Entity Coordination Game objects interact via scene manager

๐Ÿ” Pattern Components

Component Responsibility
Mediator Defines interface for coordinating communication
ConcreteMediator Implements coordination logic
Colleague Participates in communication via Mediator
ConcreteColleague Implements behavior and delegates interaction to Mediator

๐Ÿ“ UML Class Diagram

+------------------+
|     Mediator     |  <<interface>>
+------------------+
| +send(msg, user) |
+------------------+
         โ–ฒ
         |
+------------------------+
|   ConcreteMediator     |
+------------------------+
| - List<Colleague>      |
| +send(msg, user)       |
+------------------------+
         โ–ฒ
         |
  +------------------+
  |    Colleague     |
  +------------------+
  | - mediator       |
  | +send(msg)       |
  | +receive(msg)    |
  +------------------+
         โ–ฒ
         |
+---------------------+
| ConcreteColleague   |
+---------------------+
Enter fullscreen mode Exit fullscreen mode

๐Ÿ’ป Java Implementation โ€” Chatroom Example

โœ… ChatMediator.java

public interface ChatMediator {
    void sendMessage(String message, User sender);
    void addUser(User user);
}
Enter fullscreen mode Exit fullscreen mode

โœ… User.java

public abstract class User {
    protected ChatMediator mediator;
    protected String name;

    public User(ChatMediator mediator, String name) {
        this.mediator = mediator;
        this.name = name;
    }

    public abstract void send(String message);
    public abstract void receive(String message);
}
Enter fullscreen mode Exit fullscreen mode

โœ… ConcreteUser.java

public class ConcreteUser extends User {
    public ConcreteUser(ChatMediator mediator, String name) {
        super(mediator, name);
    }

    @Override
    public void send(String message) {
        System.out.println("๐Ÿ“ค " + name + " sends: " + message);
        mediator.sendMessage(message, this);
    }

    @Override
    public void receive(String message) {
        System.out.println("๐Ÿ“ฉ " + name + " receives: " + message);
    }
}
Enter fullscreen mode Exit fullscreen mode

โœ… ChatRoomMediator.java

public class ChatRoomMediator implements ChatMediator {
    private final List<User> users = new ArrayList<>();

    @Override
    public void sendMessage(String message, User sender) {
        for (User user : users) {
            if (user != sender) {
                user.receive(sender.name + ": " + message);
            }
        }
    }

    @Override
    public void addUser(User user) {
        users.add(user);
    }
}
Enter fullscreen mode Exit fullscreen mode

โœ… Client.java

public class MediatorDemo {
    public static void main(String[] args) {
        ChatMediator mediator = new ChatRoomMediator();

        User alice = new ConcreteUser(mediator, "Alice");
        User bob = new ConcreteUser(mediator, "Bob");
        User charlie = new ConcreteUser(mediator, "Charlie");

        mediator.addUser(alice);
        mediator.addUser(bob);
        mediator.addUser(charlie);

        alice.send("Hi everyone!");
        bob.send("Hello Alice!");
    }
}
Enter fullscreen mode Exit fullscreen mode

๐Ÿงช Output

๐Ÿ“ค Alice sends: Hi everyone!
๐Ÿ“ฉ Bob receives: Alice: Hi everyone!
๐Ÿ“ฉ Charlie receives: Alice: Hi everyone!
๐Ÿ“ค Bob sends: Hello Alice!
๐Ÿ“ฉ Alice receives: Bob: Hello Alice!
๐Ÿ“ฉ Charlie receives: Bob: Hello Alice!
Enter fullscreen mode Exit fullscreen mode

โœจ Benefits

Benefit Description
โœ… Loose Coupling Participants donโ€™t reference each other directly
โœ… Centralized Control All interaction logic lives in the mediator
โœ… Easy to Modify Behavior Add/remove participants or change rules easily
โœ… Improves Maintainability Simplifies debugging and testing communication

โš ๏ธ When Not to Use

  • Too few components โ€” overhead not worth it
  • Simple one-way communication โ€” Observer may be a better fit
  • When performance is critical โ€” centralization may cause latency

โœ… Summary

Aspect Value
Pattern Type Behavioral
Key Intent Centralized communication control
Java Features Used Interfaces, Polymorphism, Composition
Real-World Analogy Control Tower, Chatroom, Form Manager

๐Ÿ”ง Want More?

Would you like:

  • โœ… Event-driven Mediator with Pub/Sub?
  • โœ… UI Form coordination example (enable/disable logic)?
  • โœ… Mediator + Observer hybrid design?

Just say the word and Iโ€™ll extend it accordingly.

Top comments (0)