The Mediator Design Pattern: Centralize Complex Communications
Master the Mediator Pattern in Java. Learn how to reduce coupling by having objects communicate through a mediator instead of directly.
Moshiour Rahman
Advertisement
The Problem: Spaghetti Communication
Imagine a chat application with 5 users. If everyone talks directly to everyone:
- User A → User B, C, D, E
- User B → User A, C, D, E
- …
That’s N × (N-1) = 20 connections for 5 users!
For 100 users: 9,900 connections 💥
Each user needs to know about all other users. Adding/removing users breaks everything.
The Solution: The Mediator Pattern
The Mediator Pattern encapsulates how objects interact. Objects don’t communicate directly; they go through a mediator.
Real-Life Analogy: Air Traffic Control 🛫
Without mediator:
Pilots talk to each other directly:
- “Flight 101 to all planes: I’m landing on runway 3”
- “Flight 202 to all planes: I’m taking off from runway 5”
Chaos! Missed messages, collisions.
With mediator (ATC tower):
- Pilot → Tower: “Request landing”
- Tower → Pilot: “Cleared for runway 3”
- Tower coordinates all planes
Visualizing the Pattern

Implementation
1. The Mediator Interface
public interface ChatMediator {
void sendMessage(String message, User sender);
void addUser(User user);
}
2. Concrete Mediator
import java.util.ArrayList;
import java.util.List;
public class ChatRoom implements ChatMediator {
private List<User> users = new ArrayList<>();
@Override
public void addUser(User user) {
users.add(user);
}
@Override
public void sendMessage(String message, User sender) {
// Broadcast to all except sender
for (User user : users) {
if (user != sender) {
user.receive(message);
}
}
}
}
3. Colleague (User)
public class User {
private String name;
private ChatMediator mediator;
public User(String name, ChatMediator mediator) {
this.name = name;
this.mediator = mediator;
}
public void send(String message) {
System.out.println(name + " sends: " + message);
mediator.sendMessage(message, this); // Delegate to mediator
}
public void receive(String message) {
System.out.println(name + " received: " + message);
}
}
Usage
ChatMediator chatRoom = new ChatRoom();
User alice = new User("Alice", chatRoom);
User bob = new User("Bob", chatRoom);
User charlie = new User("Charlie", chatRoom);
chatRoom.addUser(alice);
chatRoom.addUser(bob);
chatRoom.addUser(charlie);
alice.send("Hello everyone!");
// Output:
// Alice sends: Hello everyone!
// Bob received: Hello everyone!
// Charlie received: Hello everyone!
bob.send("Hi Alice!");
// Alice received: Hi Alice!
// Charlie received: Hi Alice!
Mediator vs Observer
| Pattern | Communication | Use When |
|---|---|---|
| Mediator | Two-way coordination between colleagues | Complex interactions between objects |
| Observer | One-way notifications (Subject → Observers) | One object needs to notify many |
In The Wild (Real World Examples)
1. Java Swing Event Handling
JFrame acts as a mediator between components:
JButton button = new JButton("Click");
JTextField field = new JTextField();
button.addActionListener(e -> {
// Mediator coordinates interaction
field.setText("Button clicked");
});
2. Spring ApplicationEventPublisher
Spring’s event mechanism is a mediator:
@Service
public class OrderService {
@Autowired
private ApplicationEventPublisher eventPublisher;
public void createOrder(Order order) {
// ... save order...
eventPublisher.publishEvent(new OrderCreatedEvent(order));
// Mediator notifies all listeners
}
}
3. MVC Controller
The Controller is a mediator between Model and View:
@Controller
public class UserController {
// Mediates between UserService (model) and templates (view)
@GetMapping("/users")
public String getUsers(Model model) {
model.addAttribute("users", userService.findAll());
return "users"; // View coordinated by mediator
}
}
Cheat Sheet
| Feature | Details |
|---|---|
| Category | Behavioral |
| Problem Solved | Tight coupling from many-to-many object interactions |
| Key implementation | Central mediator object coordinates all interactions |
| Pros | Decoupling (objects don’t know about each other), Reusability |
| Cons | God Object risk (mediator can become too complex) |
Tips to Remember 🧠
- “ATC Tower”: Planes (objects) talk to tower (mediator), not each other.
- “Spaghetti Buster”: Turns N-to-N connections into N-to-1.
- “MVC”: Controller is a classic mediator example.
Advertisement
Moshiour Rahman
Software Architect & AI Engineer
Enterprise software architect with deep expertise in financial systems, distributed architecture, and AI-powered applications. Building large-scale systems at Fortune 500 companies. Specializing in LLM orchestration, multi-agent systems, and cloud-native solutions. I share battle-tested patterns from real enterprise projects.
Related Articles
The Visitor Design Pattern: Add Operations Without Modifying Classes
Master the Visitor Pattern in Java. Learn how to add new operations to object structures using double dispatch.
JavaThe Observer Design Pattern: Don't Call Us, We'll Call You
Master the Observer Pattern in Java. Learn how to implement event-driven architectures and decouple data sources from listeners.
JavaThe Command Design Pattern: Turning Actions into Objects
Master the Command Pattern in Java. Learn how to encapsulate requests as objects to enable Undo/Redo, queuing, and macro commands.
Comments
Comments are powered by GitHub Discussions.
Configure Giscus at giscus.app to enable comments.