중재자 패턴
GoF의 디자인패턴 중 행동의 중재자 패턴을 Java 로 정리한 글
객체간의 종속성을 줄일 수 있는 행동관련 디자인 패턴. 객체 간의 직접 통신을 제한하고 중재자 객체를 통해서만 협력하도록 하는 패턴
모든 사람에게 일일히 물어보는 상황을 줄이기 위해서 중간에 누가 한번에 알려주는 역할만 하게끔 하는 패턴

Untitle1
현실 세계에서 항공기 중재를 관제탑에서 관리한다 하면, 모든 비행기가 자기 주변의 비행기를 교신하면서 이동한다면, 복잡하고 어떻게 이동해야할지 많이 혼란스럽겠지만. 굳이 그럴 필요 없이 중재자인 관제탑에서 모든 책임을 지고 각 비행기에 명령을 할당하면, 훨씬 편하게 이동할 수 있을 것이다.

Untitle2
각 컴포넌트간의 의존성이 섞이는 경우가 존재하는데, 이런 경우를 방지하기 위해서는

Untitle3
아예 모든 의존성을 Dialog에서 가지고 각 패턴마다 어떤 상황에 따라서 특정 행동을 할 수 있게끔 각 컴포넌트별로 이벤트를 전달하거나 값을 전달하는 방식으로 처리하면 훨씬 관리할 것들이 줄어서 편리하다.
해당 코드는 baeldung의 예제 코드를 참고하여 각색한 코드이다.
팬
, 전원장치
와 버튼
을 이용하여 냉각 장치
를 구축한다고 할때 버튼
을 누르면 팬
이 켜지거나 꺼지고, 팬
을 켜기전에 전원장치
를 켜야하는 요구사항이 존재할 것이다. 이를 아래와 같이 구현할 수 있다.
//팬 클래스
public class Fan {
private final Button button;
private final PowerSupplier powerSupplier = new PowerSupplier();
private boolean isOn = false;
public Fan() {
this.button = new Button(this);
}
public Fan(Button button) {
this.button = button;
}
public void turnOn() {
isOn = true;
powerSupplier.turnOn();
}
public void turnOff() {
isOn = false;
powerSupplier.turnOff();
}
public boolean isOn() {
return isOn;
}
public Button getButton() {
return button;
}
public PowerSupplier getPowerSupplier() {
return powerSupplier;
}
}
//버튼 클래스
public class Button {
private Fan fan;
public Button() {
this.fan = new Fan(this);
}
public Button(Fan fan) {
this.fan = fan;
}
public void press(){
if(fan.isOn()){
fan.turnOff();
} else {
fan.turnOn();
}
}
}
//전원 장치 클래스
public class PowerSupplier {
public void turnOn() {
System.out.println("파워 on");
}
public void turnOff() {
System.out.println("파워 off");
}
}
//냉각 장치 클래스
public class Circulator {
private Fan fan;
private Button button;
private PowerSupplier powerSupplier;
public Circulator() {
this.fan = new Fan();
this.button = fan.getButton();
this.powerSupplier = fan.getPowerSupplier();
}
public Fan getFan() {
return fan;
}
public Button getButton() {
return button;
}
public PowerSupplier getPowerSupplier() {
return powerSupplier;
}
}
//클라이언트
public class Client {
public static void main(String[] args) {
Circulator circulator = new Circulator();
Button button = circulator.getButton();
button.press();
button.press();
}
}
//print
파워 on
파워 off
위 코드의 문제점은
Fan
이 Button
, PowerSupplier
을 가지고 있고 Button