📢 This article was translated by gemini-3-flash-preview
Mediator Pattern - Object Behavioral Pattern
Intent
Define an object that encapsulates how a set of objects interact. The Mediator pattern promotes loose coupling by keeping objects from referring to each other explicitly, allowing you to vary their interaction independently.
Structure

Participants:
- Mediator: Defines an interface for communicating with Colleague objects.
- ConcreteMediator: Implements cooperative behavior by coordinating Colleague objects; it knows and maintains its colleagues.
- Colleague class: Each colleague knows its Mediator object; colleagues communicate with the mediator whenever they would have otherwise communicated with another colleague.
Applicability
Use the Mediator pattern when:
- A set of objects communicate in well-defined but complex ways, resulting in tangled and hard-to-understand dependencies.
- An object references many other objects and communicates with them directly, making the object difficult to reuse.
- A behavior distributed among several classes should be customizable without creating many subclasses.
Example 1
Online payment is a crucial part of e-commerce, and different platforms provide different payment interfaces. We need to integrate these various interfaces so that customers don’t have to worry about specific payment details when shopping. Here is a Mediator pattern implementation for this requirement:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
| interface WebServiceMediator {
public void buy(double money, WebService service);
public void SetAmazon(WebService amazon);
public void SetEbay(WebService ebay);
}
abstract class WebService {
protected WebServiceMediator mediator;
public abstract void SetMediator(WebServiceMediator mediator);
public abstract void buyService(double money);
public abstract void search(double money);
}
class ConcreteServiceMediator implements WebServiceMediator {
private WebService amazon;
private WebService ebay;
public ConcreteServiceMediator() {
amazon = null;
ebay = null;
}
public void SetAmazon(WebService amazon) {
this.amazon = amazon;
}
public void SetEbay(WebService ebay) {
this.ebay = ebay;
}
public void buy(double money, WebService service) {
if (service == amazon)
amazon.search(money);
else
ebay.search(money);
}
}
class Amazon extends WebService {
public void SetMediator(WebServiceMediator mediator) {
this.mediator = mediator;
}
public void buyService(double money) {
mediator.buy(money, this);
}
public void search(double money) {
System.out.println("Amazon received: " + money);
}
}
class Ebay extends WebService {
public void SetMediator(WebServiceMediator mediator) {
this.mediator = mediator;
}
public void buyService(double money) {
mediator.buy(money, this);
}
public void search(double money) {
System.out.println("Ebay received: " + money);
}
}
|
Example 2
Simple communication between two colleagues.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
| public class MediatorPattern {
public static void main(String[] args) {
ConcreteMediator m = new ConcreteMediator();
Colleague1 c1 = new Colleague1(m);
Colleague2 c2 = new Colleague2(m);
m.setC1(c1);
m.setC2(c2);
c1.sendMessage("hello");
c2.sendMessage("hi");
}
}
abstract class Colleague{
protected Mediator mediator;
}
class Colleague1 extends Colleague{
public Colleague1(Mediator mediator){
this.mediator = mediator;
}
public void sendMessage(String message){
mediator.sendMessage(message, this);
}
public void Notify(String message){
System.out.println("Colleague1 received: " + message);
}
}
class Colleague2 extends Colleague{
public Colleague2(Mediator mediator){
this.mediator = mediator;
}
public void sendMessage(String message){
mediator.sendMessage(message, this);
}
public void Notify(String message){
System.out.println("Colleague2 received: " + message);
}
}
abstract class Mediator{
public abstract void sendMessage(String message, Colleague c);
}
class ConcreteMediator extends Mediator{
// Defined directly since there are few objects in this example
private Colleague1 c1;
private Colleague2 c2;
// If there were many colleagues:
// List<Colleague> list = new ArrayList<>();
// public void Add(Colleague c){
// list.add(c);
// }
public void setC1(Colleague1 c1){
this.c1 = c1;
}
public void setC2(Colleague2 c2){
this.c2 = c2;
}
@Override
public void sendMessage(String message, Colleague c){
if(c == c1){
// Pass message to colleague 2
c2.Notify(message);
}else{
// Pass message to colleague 1
c1.Notify(message);
}
}
}
|