퍼사드 패턴(Facade Pattern)

wannabeking·2022년 10월 13일
0

디자인 패턴

목록 보기
9/14
post-thumbnail

규칙적인 아침식사

어떤 한 사람은 효율적인 아침식사를 준비하기 위하여 매일 다음과 같은 행동을 한다.

  • 토스트기 켜기(식빵 넣기)
  • 냉장고 문 열기(우유 꺼내기)
  • 냉장고 문 닫기
  • 토스트기 끄기

이 것을 코드로 표현하면 다음과 같다.

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("냉장고 문 닫기");
    }
}

앞서 말했듯이 ToastMachineRefrigerator은 아침식사 준비의 관점으로 보았을 때 서브시스템이다.


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()만 호출하면 된다.

출력은 다음과 같다.


모든 소스코드는 여기에서 확인할 수 있다.



profile
내일은 개발왕 😎

0개의 댓글