Mediator (중재자 패턴)
22 May 2019 | design pattern programming softwaremediator Pattern
여러 객체가 상태를 가지고 있지만, 하나로 정리가 되지 않을 때 모든 객체가 중개인에게만 보고하고,
중개인만이 객체에게 지시를 내릴 수 있게 하는 패턴이다.
중개인은 mediator(조정자), 지시를 받는 객체는 colleague(동료)라고 부른다.
예를 들어, GUI 프로그래밍에서 각 컴포넌트 간에 상태가 존재하고, 상태를 중간에서 관리하고 싶을때 사용할 수 있다. 예를들어 floatingWindow가 두개 존재하는데, 중간의 상태에 따라 visible을 결정하는 것을 간단하게 프로그래밍 해보겠다.
public interface Mediator {
public abstract void createColleagues();
public abstract void colleagueChanged();
public abstract void setState(int state);
}
Mediator를 인터페이스로 만들어서 필요한 colleague들을 만들수 있는 함수와 상태가 변했을 경우
colleague들의 메소드를 호출하는 추상 함수를 만든다.
public class AppManager implements Mediator {
private int stateNum = 0;
private ItemWindow itemWindow = new ItemWindow();
private MainWindow mainWindow = new MainWindow();
@Override
public void createColleagues() {
itemWindow.setMediator(this);
mainWindow.setMediator(this);
}
@Override
public void colleagueChanged() {
switch(stateNum) {
case 0:
mainWindow.setColleagueVisible(true);
itemWindow.setColleagueVisible(false);
case 1:
mainWindow.setColleagueVisible(false);
itemWindow.setColleagueVisible(true);
case 2:
mainWindow.setColleagueVisible(false);
itemWindow.setColleagueVisible(false);
default:
itemWindow.setColleagueVisible(false);
break;
}
}
@Override
public void setState(int state) {
this.stateNum = state;
}
}
그리고 mediator를 구현한다.
public interface Colleague {
public abstract void setMediator(Mediator mediator);
public abstract void setColleagueVisible(boolean enabled);
}
colleague는 mediator를 받을 수 있다. 따라서 중재자가 필요한 경우 호출할 수 있는데,
작성하는 코드의 경우에는 상황에 따라 mediator의 상태를 바꿀수 있을 것이다.
public class ItemWindow implements Colleague{
private Mediator mediator;
private boolean isVisible;
@Override
public void setMediator(Mediator mediator) {
this.mediator = mediator;
}
@Override
public void setColleagueVisible(boolean enabled) {
isVisible = enabled;
}
}
public class MainWindow implements Colleague{
private Mediator mediator;
private boolean isVisible;
@Override
public void setMediator(Mediator mediator) {
this.mediator = mediator;
}
@Override
public void setColleagueVisible(boolean enabled) {
isVisible = true;
}
}
colleague를 상속받아 구현하였다. 이들은 mediator에 colleagues들에 등록될 수 있으며, 이벤트 발생시 바로 받아볼 수 있다.