부품객체 간의 직접적인 참조(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. 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클래스를 통해 전달되는 것을 알 수 있다.
문제상황에서 새로운 Component가 추가되거나 기존 Component가 사라진다면 다른 Component에 영향을 미칠 것이다.
수정해도 Meidator와 바뀌는 ConcreteComponent만 수정해주면 된다.