중재자 패턴은 객체간 커뮤니케이션을 하는 경우 중재자를 생성하여 객체끼리의 결합을 약화하는 디자인 패턴이다. 중재자 패턴을 사용하면 N:M개의 객체, 또는 N:1개의 객체간의 데이터 전달도 구현할 수 있다.
객체의 통신을 다룬다는 점에서 옵저버 패턴과 비슷하지만, 옵저버패턴은 한 객체에서 일방적으로 데이터를 송신하는데 반해 중재자패턴은 양방향으로 데이터를 전달할 수 있다는 것이 차이점이다.
@Getter
@Setter
public abstract class Colleague {
protected String name;
private Mediator mediator;
private String message;
public Colleague(String name) {
this.name = name;
}
public void send() {
System.out.println(this.name + " send()");
mediator.mediate(this);
}
public abstract void receive(Colleague colleague);
}
public class ConcreteColleague extends Colleague{
public ConcreteColleague(String name) {
super(name);
}
@Override
public void receive(Colleague colleague) {
System.out.println(this.name + " received " + colleague.getName() + "'s Message : " + colleague.getMessage());
}
}
다른 객체와 통신을 하는 Colleague를 만들었다. 하지만, Colleague가 직접 동신하지는 않고 Mediator를 거쳐야 통신할 수 있다.
public interface Mediator {
void addColleague(Colleague colleague);
void mediate(Colleague colleague);
}
public class ConcreteMediator implements Mediator {
private final List<Colleague> colleagues = new ArrayList<>();
@Override
public void addColleague(Colleague colleague) {
this.colleagues.add(colleague);
colleague.setMediator(this);
}
@Override
public void mediate(Colleague colleague) {
for (Colleague receiverColleague : colleagues) {
System.out.println(" Mediating " + colleague.getName() + " to " + receiverColleague.getName());
receiverColleague.receive(colleague);
}
}
}
Mediator 클래스는 여러 컴포넌트를 통제해준다. Colleague를 list로 가지고있고 mediate()를 호출하면 그 Colleague들에게 메세지를 뿌려준다. 마치 SocketIo에서 socketIOServer.getRoomOperations().sendEvent();
로 소켓 메세지를 전송하는 것과 같다...!
public class App {
public static void main(String args[]) {
Mediator mediator = new ConcreteMediator();
Colleague colleague1 = new ConcreteColleague("User1");
Colleague colleague2 = new ConcreteColleague("User2");
mediator.addColleague(colleague1);
mediator.addColleague(colleague2);
colleague1.setMessage("Hello, world!");
colleague1.send();
}
}
//실행 결과
User1 send()
Mediating User1 to User1
User1 received Message : Hello, world!
Mediating User1 to User2
User2 received Message : Hello, world!
colleague1에서 mediator로 보낸 메세지가 mediator를 구독하고 있는 객체들에게 무사히 전달되는 것을 볼 수 있다.
이렇게 여러 객체간의 통신을 중재해주는 객체를 추가해줌으로써, 통신 객체 간 의존성을 줄여 결합도를 감소시키는 것이 중재자 패턴이었다.
이 링크로 가면 코드를 볼 수 있다.