외부의 object는 내부의 구조를 얻지 못하며 object가 제공하는 attribute와 method만 이용할 수 있다.
보호하는 이유는 외부의 잘못된 사용으로 인해 object가 손상되지 않도록 하는 목적이 있다.
PurposeofMediator 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 + " ");
}
}
}