JAVA/DesignPattern

Design Pattern 디자인 패턴 Mediator Pattern 중재자 패턴

호두밥 2021. 12. 25. 20:36

Mediator Pattern 중재자 패턴

행동 패턴으로, 여러 객체와 클래스들 사이에서 의사소통의 복잡도를 낮추기 위해 사용되는 패턴입니다. 

객체 간의 직접적인 소통을 제한하고, 중재자 객체를 통해서 협력하도록 강제합니다. 

Mediator Pattern 중재자 패턴 사용이 적합한 경우

  • 클래스끼리 밀접하게 묶여 있어, 몇개의 클래스를 수정하기가 어려운 경우
    • 클래스들 간의 관계를 분리된 클래스로 추출하여 변경사항을 관리할 수 있습니다. 
  • 다른 컴포넌트에 너무 많이 의존하고 있어서, 다른 프로그램에서 컴포넌트를 재사용하기 어려운 경우
    • 중재자 패턴을 적용하면, 개별 컴포넌트들은 다른 컴포넌트를 인지하지 못합니다. 다른 앱에서 컴포넌트를 재사용하려면, 새로운 중재자 객체를 제공해야 합니다.
  •  다양한 컨텍스트에서 몇가지 기본 동작을 재사용하기 위해,  서브 클래스를 만들어야 하는 경우
    • 중재자 객체에 모든 관계가 정의되어 있기 때문에, 컴포넌트를 수정하지 않고, 새로운 중재자를 생성하는 것으로 컴포넌트의 기능을 사용하는 새로운 방법을 정의할 수 있습니다. 

장단점

장점

  • 다양한 컴포넌트 간의 의사소통을 별도의 클래스로 추출해서 관리할 수 있습니다. (단일책임원칙)
  • 실제 컴포넌트를 수정하지 않고도 새로운 중재자 객체를 생성할 수 있습니다. (개방/폐쇄원칙)
  • 프로그램에서 컴포넌트의 중복을 줄일 수 있습니다.
  • 컴포넌트를 좀 더 쉽게 재사용할 수 있습니다. 

단점

  • 시간이 지나면, 중재가 God Object로 변할 수 있습니다.

* God Object : 모든 걸 혼자서 다 해내는, 절대적인 객체

Mediator Pattern 중재자 패턴

객체가 직접 메소드를 호출하지 않고 Mediator 객체를 통해 메소드를 호출하도록 합니다. 

Mediator

public interface Mediator {
     void play(Command command, String string);
}

ConcreteMediator

public class ConcreteMediator implements Mediator {
    @Override
    public void play(Command command, String string) {
        System.out.println(command.getClass().getName()+":"+string);
    }
}

Command

public interface Command {
    void execute();
}

MusicPlayer

public class MusicPlayer implements Command {
    Mediator meidator;

    public MusicPlayer(Mediator meidator) {
        this.meidator = meidator;
    }

    public MusicPlayer() {
        this.meidator = new ConcreteMediator();
    }

    @Override
    public void execute() {
        meidator.play(this, "♬♩");
    }
}

VideoPlayer

public class VideoPlayer implements Command{
    Mediator meidator;

    public VideoPlayer(Mediator meidator) {
        this.meidator = meidator;
    }

    public VideoPlayer() {
        this.meidator = new ConcreteMediator();
    }

    @Override
    public void execute() {
        meidator.play(this, "(●'◡'●)(●'◡'●)");
    }
}

Main

public class Main {
    public static void main(String[] args) {
       VideoPlayer videoPlayer = new VideoPlayer();
       videoPlayer.execute();

       MusicPlayer musicPlayer = new MusicPlayer();
       musicPlayer.execute();
    }
}
javatest.designPattern.mediator.VideoPlayer:(●'◡'●)(●'◡'●)
javatest.designPattern.mediator.MusicPlayer:♬♩

참조