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들에 등록될 수 있으며, 이벤트 발생시 바로 받아볼 수 있다.