[Java] Design Pattern - Mediator

한 클래스에서의 이벤트가 연결된 다른 클래스의 객체에 영향을 미칠때 미디어에이터 패턴으로 효율적인 설계를 할 수 있다.

어떤 클래스의 객체에서 특정 이벤트 가 발생할 때마다 연결된 다른 클래스들에 알려야하는 경우가 있다.

예제 코드로 좀 더 디테일 하게 알아보자

public interface ModeListener {
    public void onModeChange(Mode mode);
}

class ListView implements ModeListener {

    @Override
    public void onModeChange(Mode mode) {
        System.out.println("리스트뷰 " + (mode == Mode.LIST ? "보여줌" : "감춤"));
    }
}

class GalleryView implements ModeListener {

    @Override
    public void onModeChange(Mode mode) {
        System.out.println("갤러리뷰 " + (mode == Mode.GALLERY ? "보여줌" : "감춤"));
    }
}

class DataDownloader implements ModeListener {

    @Override
    public void onModeChange(Mode mode) {
        System.out.println((mode == Mode.LIST ? "리스트" : "갤러리") + "뷰용 데이터 다운로드");
    }
}
import java.util.ArrayList;

public class ModeMediator {
    ArrayList<ModeListener> listeners = new ArrayList<>();

    public void addListener(ModeListener listener) {
        listeners.add(listener);
    }

    public void onModeChange(Mode mode) {
        for (ModeListener listener : listeners) {
            listener.onModeChange(mode);
        }
    }
}
public class ModeSwitch {

    Mode mode = Mode.LIST;

    ModeMediator modeMediator;

    public void setModeMediator(ModeMediator modeMediator) {
        this.modeMediator = modeMediator;
    }

    public void toggleMode() {
        mode = mode == Mode.LIST ? Mode.GALLERY : Mode.LIST;

        if (modeMediator != null) {
            modeMediator.onModeChange(mode);
        }
    }
}

enum Mode {LIST, GALLERY}
public class Main {
    public static void main(String[] args) {
        ModeSwitch modeSwitch = new ModeSwitch();
        ModeMediator modeMediator = new ModeMediator();

        modeSwitch.setModeMediator(modeMediator);

        modeMediator.addListener(new ListView());
        modeMediator.addListener(new GalleryView());
        modeMediator.addListener(new DataDownloader());

        modeSwitch.toggleMode();

        System.out.println("====");

        modeSwitch.toggleMode();
    }
}

좋은 웹페이지 즐겨찾기