서로 관련된 객체 사이의 복잡한 통신과 제어를 한곳으로 집중화고 싶다면 중재자(Mediator) 패턴을 사용한다.
중재자 패턴은 객체 간의 상호 작용을 캡슐화하여, 객체 간의 직접적인 통신을 방지하고 중재자를 통해 상호 작용을 조정하는 행위 패턴 중 하나이다.
이를 통해 객체 간의 결합도를 낮추고, 유연성을 높이며, 유지 보수성을 개선하는 데 사용된다.
특징
서로 연관된 GUI 구성 요소를 관리하는 용도로 많이 쓰인다.
- 상호 작용의 중앙화
- 객체 간의 상호 작용을 중앙화하여 중재자를 통해 조정한다.
- 결합도 감소
- 객체 간의 직접적인 통신을 피하고, 중재자를 통해 간접적으로 통신하여 결합도를 낮춘다.
- 유연성 향상
- 객체 간의 결합도가 낮아지므로, 변화에 대한 유연성이 향상된다.
구조

- Mediator(중재자)
- 객체 간의 상호 작용을 조정하는 인터페이스를 정의한다.
- ConcreteMediator(구체적인 중재자)
Mediator
를 구현하고, 객체 간의 상호 작용을 조정한다.
- Colleague(협력자)
- 중재자와 통신하는 객체로, 상호 작용을 중재자를 통해 수행한다.
예시
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
80
81
82
83
84
85
86
87
| // Mediator 인터페이스
public interface Mediator {
void sendMessage(String message, Colleague colleague);
}
// ConcreteMediator 구현
public class ConcreteMediator implements Mediator {
private Colleague colleague1;
private Colleague colleague2;
public void setColleague1(Colleague colleague1) {
this.colleague1 = colleague1;
}
public void setColleague2(Colleague colleague2) {
this.colleague2 = colleague2;
}
@Override
public void sendMessage(String message, Colleague colleague) {
if (colleague == colleague1) {
colleague2.receiveMessage(message);
} else {
colleague1.receiveMessage(message);
}
}
}
// Colleague 인터페이스
public interface Colleague {
void sendMessage(String message);
void receiveMessage(String message);
}
// ConcreteColleague 구현
public class ConcreteColleague1 implements Colleague {
private Mediator mediator;
public ConcreteColleague1(Mediator mediator) {
this.mediator = mediator;
}
@Override
public void sendMessage(String message) {
mediator.sendMessage(message, this);
}
@Override
public void receiveMessage(String message) {
System.out.println("ConcreteColleague1 received message: " + message);
}
}
// ConcreteColleague 구현
public class ConcreteColleague2 implements Colleague {
private Mediator mediator;
public ConcreteColleague2(Mediator mediator) {
this.mediator = mediator;
}
@Override
public void sendMessage(String message) {
mediator.sendMessage(message, this);
}
@Override
public void receiveMessage(String message) {
System.out.println("ConcreteColleague2 received message: " + message);
}
}
// Client
public class Client {
public static void main(String[] args) {
ConcreteMediator mediator = new ConcreteMediator();
ConcreteColleague1 colleague1 = new ConcreteColleague1(mediator);
ConcreteColleague2 colleague2 = new ConcreteColleague2(mediator);
mediator.setColleague1(colleague1);
mediator.setColleague2(colleague2);
colleague1.sendMessage("Hello from Colleague1!");
colleague2.sendMessage("Hi from Colleague2!");
}
}
|
장단점
장점
- 결합도 감소
- 객체 간의 직접적은 통신을 피하고 중재자를 통해 간접적으로 통신함으로써 결합도를 감소기킨다.
- 재사용성 증가
- 시스템과 객체를 분리함으로써 재사용성을 획기적으로 향상시킬수 있다.
- 제어로직을 한 군데 모아놨으므로 관리하기 수월하다.
- 시스템에 들어있는 객체 사이에서 오가는 메시지를 대폭 줄이고 단순화 할 수 있다.
단점
- 복잡성 증가
- 디자인을 잘 하지 못하면 중재자 객체가 너무 복잡해질 수 있다.
- 모든 통신이 중재라를 통해 이루어져야 함
- 모든 객체 간의 통신이 중재자를 통해 이루어져야 하므로, 중재자에게 모든 통신을 전달하는 부하가 발생 가능