중재자 패턴

이정석·2023년 6월 19일
0

디자인패턴

목록 보기
9/23

중재자 패턴이란?

부품객체 간의 직접적인 참조(M:N)구조를 중재자 객체를 둠으로 1:N구조로 각 객체들 사이의 의존성을 줄이는 패턴


문제상황

1. 다음과 같은 Pilot클래스가 있다.

public class Pilot {
    private ControlTower controlTower;
    private Runway runway;

    public Pilot(ControlTower controlTower, Runway runway) {
        this.controlTower = controlTower;
        this.runway = runway;
    }

    public void requestTakeoff() {
        System.out.println("Pilot requesting takeoff.");
        controlTower.grantTakeoffPermission();
        runway.prepareForTakeoff();
    }
}

조종사는 관제탑과 활주로 클래스를 참조하고 이륙요청을 관제탑과 활주로 클래스에 요청한다.

2. ControlTower클래스는 다음과 같다.

public class ControlTower {
    private Pilot pilot;
    private Runway runway;

    public ControlTower(Pilot pilot, Runway runway) {
        this.pilot = pilot;
        this.runway = runway;
    }

    public void grantTakeoffPermission() {
        System.out.println("ControlTower granting takeoff permission.");
        pilot.requestTakeoff();
        runway.prepareForTakeoff();
    }
}

3. Runway클래스는 다음과 같다.

public class Runway {
    private Pilot pilot;
    private ControlTower controlTower;

    public Runway(Pilot pilot, ControlTower controlTower) {
        this.pilot = pilot;
        this.controlTower = controlTower;
    }

    public void prepareForTakeoff() {
        System.out.println("Runway preparing for takeoff.");
        pilot.requestTakeoff();
        controlTower.grantTakeoffPermission();
    }
}

구조

  1. Mediator: Component객체들 사이의 통신을 위한 추상클래스로 Component객체들이 보내는 메시지를 보대고 받는데 필요한 메서드를 정의한다.
  2. ConcreteMediator: Mediator의 메소드를 구현하는 클래스로 Component객체들 사이의 통신 방식을 실제로 구현한다. Mediator가 하나인 경우는 Mediator를 상위 클래스로 두지않고 바로 구현하기도 한다.
  3. Component: Mediator와 통신하는 Component객체를 추상화한 클래스이다. Mediator와 소통하기 위한 기본 메서드를 가지고 있고 이를 상속받는 서브클래스에서 구현한다.
  4. ConcreteComponent: Component클래스를 구현하는 클래스로 다른 ConcreteComponent와 Mediator를 통해 통신한다. Mediator를 통해 받은 요청에 응답하는 방식으로 구현한다.

코드(JAVA)

1. Pilot

public class Pilot {
    private ControlTower controlTower;

    public Pilot(ControlTower controlTower) {
        this.controlTower = controlTower;
    }

    public void requestTakeoff() {
        System.out.println("Pilot requesting takeoff.");
        controlTower.processTakeoffRequest();
    }
}

2. ControlTower

public class ControlTower {
    private Runway runway;

    public ControlTower(Runway runway) {
        this.runway = runway;
    }

    public void processTakeoffRequest() {
        System.out.println("ControlTower processing takeoff request.");
        runway.prepareForTakeoff();
    }
}

3. Runway

public class Runway {
    public void prepareForTakeoff() {
        System.out.println("Runway preparing for takeoff.");
    }
}

위 상황에서 Pilot이 Runway에 보내는 요청이 Mediator 역할을 하는 ControlTower클래스를 통해 전달되는 것을 알 수 있다.


중재자패턴은?

  1. 객체들끼리 직접 참조하는 것을 피함으로 객체들 간의 강한 결합을 줄인다. M:N구조를 1:N구조로 바꾼다.

    문제상황에서 새로운 Component가 추가되거나 기존 Component가 사라진다면 다른 Component에 영향을 미칠 것이다.

  2. Mediator를 중간에 둠으로 Component가 상호작용하는 방법이 변경되어도 다른 Component에 영향을 미치지 않는다.

    수정해도 Meidator와 바뀌는 ConcreteComponent만 수정해주면 된다.

profile
게임 개발자가 되고 싶은 한 소?년

0개의 댓글