어떤 한 사람은 효율적인 아침식사를 준비하기 위하여 매일 다음과 같은 행동을 한다.
이 것을 코드로 표현하면 다음과 같다.
ToastMachine toastMachine = new ToastMachine();
Refrigerator refrigerator = new Refrigerator();
toastMachine.turnOn();
refrigerator.open();
refrigerator.close();
toastMachine.turnOff();
무언가 깔끔하지 않다.
순서를 헷갈려 토스트를 굽기 전에 냉장고 문부터 열 수도 있을 것이다.
퍼사드 패턴을 사용하여 단 한 번의 메소드 호출로 일련의 동작들을 모두 포함시켜보자.
퍼사드 패턴은 클라이언트에게 단순화된 인터페이스를 제공하여 서브시스템들을 더 편리하게 사용할 수 있게 해준다.
또한 하나의 인터페이스를 통하여 서브시스템들을 사용하기 때문에 클라이언트와 서브시스템이 서로 긴밀하게 연결되지 않아도 된다.
위의 예제에서 서브시스템은 토스트 기계와 냉장고가 될 것이며 퍼사드 패턴을 사용하여 클라이언트에게 아침식사 준비를 단순하게 제공할 것이다.
public class ToastMachine {
public void turnOn() {
System.out.println("토스트기 켜기");
}
public void turnOff() {
System.out.println("토스트기 끄기");
}
}
public class Refrigerator {
public void open() {
System.out.println("냉장고 문 열기");
}
public void close() {
System.out.println("냉장고 문 닫기");
}
}
앞서 말했듯이 ToastMachine
과 Refrigerator
은 아침식사 준비의 관점으로 보았을 때 서브시스템이다.
public class BreakfastFacade {
private ToastMachine toastMachine;
private Refrigerator refrigerator;
public BreakfastFacade(ToastMachine toastMachine, Refrigerator refrigerator) {
this.toastMachine = toastMachine;
this.refrigerator = refrigerator;
}
public void prepareMeal() {
toastMachine.turnOn();
refrigerator.open();
refrigerator.close();
toastMachine.turnOff();
}
}
BreackfastFacade
는 서브시스템들을 필드로 가지고 일련의 아침식사 준비 과정들을 prepareMeal()
이라는 단순화된 인터페이스로 클라이언트에게 제공한다.
psvm으로 넘어가자.
public class Main {
public static void main(String[] args) {
System.out.println("--퍼사드 패턴 X--");
ToastMachine toastMachine = new ToastMachine();
Refrigerator refrigerator = new Refrigerator();
toastMachine.turnOn();
refrigerator.open();
refrigerator.close();
toastMachine.turnOff();
System.out.println("--퍼사드 패턴 O--");
BreakfastFacade breakfastFacade = new BreakfastFacade(toastMachine, refrigerator);
breakfastFacade.prepareMeal();
}
}
이제 클라이언트는 토스트 기계를 키고... 냉장고 문을 열고... 냉장고..의 과정을 거치지 않고 prepareMeal()
만 호출하면 된다.
출력은 다음과 같다.
모든 소스코드는 여기에서 확인할 수 있다.