컴포넌트들은 다른 컴포넌트들을 인식하지 않아야 한다. 컴포넌트 내에서 또는 컴포넌트에 중요한 일이 발생하면, 컴포넌트는 이를 중재자에게만 알려야 한다. 중재자는 알람을 받으면 발송자를 쉽게 식별할 수 있으며, 이는 응답으로 어떤 컴포넌트가 작동되어야 하는지 결정하기에 충분할 수 있다
컴포넌트의 관점에서는 모든 것들이 블랙박스들처럼 보인다. 발송자는 누가 요청을 처리할 지 모르고 수신자는 누가 처음에 요청을 보냈는지 모른다
interface ISource{
public void setMediator(Mediator mediator);
public void eventOccured(String event);
}
package MediatorPattern;
interface IDestination{
public void receiveEvent(String from, String event);
}
public class TcpComm implements ISource {
Mediator mediator;
@Override
public void setMediator(Mediator mediator){ // 중재자 설정
this.mediator = mediator;
}
@Override
public void eventOccured(String event){ // 이벤트의 전달
mediator.onEvent("TCP comm", event);
}
}
class Display implements IDestination{
@Override
public void receiveEvent(String from, String event){
System.out.println("Display : from " + from + " event : " + event);
}
}
interface IMediator{
public void addDestination(IDestination destination);
public void onEvent(String from, String event);
}
class CMediator implements IMediator{
List<IDestination> list = new ArrayList<IDestination>();
@Override
public void addDestination(IDestination destination){
list.add(destination);
}
@Override
public void onEvent(String from, String event){
for(IDestination each : list){ // 이벤트의 전송
each.receiveEvent(from, event);
}
}
}
public class MediatorMain {
public static void main(String[] args) {
Mediator mediator = new Mediator();
ISource tcp = new TcpComm();
tcp.setMediator(mediator);
ISource system = new SystemSignal();
system.setMediator(mediator);
mediator.addDestination(new Display());
mediator.addDestination(new Log());
tcp.eventOccured("connected");
tcp.eventOccured("disconnected");
system.eventOccured("key input");
system.eventOccured("mouse input");
}
}