Mediator Pattern
- 모든 class 간의 복잡한 상호작용을 캡슐화(encapsulate)하여 하위 class에 위임하여 처리할 수 있도록 하는 패턴.
- Object들 사이의 복잡한 관계를 다수 대 하나의 관계로 바꿔주기 위해 Mediator(중재자) pattern을 이용한다. 관계의 복잡성을 떨어뜨려 유지 보수 및 재사용의 확장성에 유리한 패턴
- Object들 사이에 관계를 통제하는 Mediator를 삽입하여 모든 object들이 복잡한 communication을 가능하게 만듭니다.
캡슐화(Encapsulate)란?
- 중요한 데이터를 보존, 보호하기 위해서 연관 있는 attribute와 method를 class로 묶는 작업을 말합니다.
- Access Modifier을 이용해서 은닉성을 유지합니다.
- 외부의 object는 내부의 구조를 얻지 못하며 object가 제공하는 attribute와 method만 이용할 수 있다.
- 보호하는 이유는 외부의 잘못된 사용으로 인해 object가 손상되지 않도록 하는 목적이 있다.
Purpose of Mediator Pattern
- 복잡한 상호작용 관계에서 object들을 캡슐화(encapsulate)함으로써 object 간의 의존성이 감소하여 loose coupling을 유지하기 위해 사용한다.
- 서로의 관계를 알아야 할 필요가 없어지고 mediator에 의해서 관리하기 위함
Example of Mediator Pattern
// MediatorDemo.java
public class MediatorDemo.java {
public static void main( String[] args ) {
Mediator mb = new Mediator();
new Producer( mb ).start();
new Producer( mb ).start();
new Consumer( mb ).start();
new Consumer( mb ).start();
new Consumer( mb ).start();
new Consumer( mb ).start();
}
}
// Mediator.java
public class Mediator {
private boolean slotFull = false;
private int number;
public synchronized void storeMessage(int num) {
while (slotFull == true) {
try {
wait();
} catch (InterruptedException e) {
}
}
slotFull = true;
number = num;
notifyAll();
}
public synchronized int retrieveMessage() {
while (slotFull == false)
try {
wait();
} catch (InterruptedException e) {
}
slotFull = false;
notifyAll();
return number;
}
}
// Consumer.java
public class Consumer extends Thread {
private Mediator med;
private int id;
private static int num = 1;
public Consumer(Mediator m) {
med = m;
id = num++;
}
public void run() {
while (true) {
System.out.print("c" + id + "-" + med.retrieveMessage() + " ");
}
}
}
// Producer.java
public class Producer extends Thread {
private Mediator med;
private int id;
private static int num = 1;
public Producer(Mediator m) {
med = m;
id = num++;
}
public void run() {
int num;
while (true) {
med.storeMessage(num = (int) (Math.random() * 100));
System.out.print("p" + id + "-" + num + " ");
}
}
}