Mediator (중재자 패턴)

|

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