본문 바로가기
Programming/디자인 패턴

퍼사드 패턴 Façade Pattern

by Bam_t 2021. 9. 20.
728x90

퍼사드(Façade)란 프랑스어로 건물의 출입 외벽을 의미합니다.아래 그림처럼 건물 외관에 대한 디자인을 의미합니다. 이처럼 퍼사드 패턴은 건물 외벽으로 전체를 간략하게 나타내주는 패턴입니다.

Façade


1. 퍼사드 패턴

퍼사드 패턴은 어떤 객체에 대해 서브 시스템들의 통합된 인터페이스를 제공하는 패턴입니다. 퍼사드를 이용해서 서브 시스템에 쉽게 접근할 수 있게됩니다. 다시말하자면, 통합된 인터페이스 서브 시스템에 대해 쉬운 접근을 하게 해주는 패턴이 퍼사드 패턴입니다.

 

 

2. 최소 지식 원칙

최소 지식 원칙은 정말 가까운 친구 사이에서만 상호작용을 허용한다는 원칙입니다. 이 원칙은 객체를 만들면 그 객체와 상호작용을 하게될 클래스의 수와 방식에 주의를 기울여야 합니다. 그러니까 객체들 끼리 복잡하게 얽혀서 보수과정에서 이 객체 저 객체 고치는 것을 지양하기 위한 원칙이죠.

그렇다면 이 최소 지식 원칙을 지키기 위해서는 어떻게 하는 것이 좋을까요. 바로 다음 네 종류의 객체 메소드만을 호출하면 됩니다.

  • 객체 그 자체
  • 메소드에 매개변수로 전달된 객체
  • 그 메소드에서 생성하거나 인스턴스를 만든 객체
  • 그 객체에 속하는 구성요소

퍼사드 패턴은 서브 시스템에 대해서 통합된 인터페이스를 지원한다고 했었습니다. 그렇다면, 퍼사드를 이용한다는 것은 이 원칙을 이용해서 패턴을 설계해야합니다.

 

 

3. 퍼사드 패턴 구현

자동차가 있습니다. 자동차에는 수많은 기능들이 있죠. 라디오, 네이게이션, 창문 제어, 시동 제어 등 수많은 기능이 있습니다. 

public class MediaPlayer {
    public void mediaPlayerOn(){
        System.out.println("미디어 재생");
    }

    public void mediaPlayerOff() {
        System.out.println("미디어 종료");
    }
}

public class Engine {
    public void engineOn(){
        System.out.println("시동 걸기");
    }

    public void engineOff(){
        System.out.println("시동 끄기");
    }
}

public class WindowControl {
    public void windowOpen() {
        System.out.println("창문 열기");
    }
    public void windowClose(){
        System.out.println("창문 닫기");
    }
}

 

만약 이렇게 구성되어있다고 할 때 퍼사드 패턴을 이용하지 않는다면, 이 메소드들을 이용하려면 다음과 같이 해야할 것입니다.

MediaPlayer mediaPlayer = new MediaPlayer();
Engine engine = new Engine();
WindowControl windowControl = new WindowControl();

engine.engineOn();
mediaPlayer.mediaPlayerOn();
windowControl.windowOpen();
engine.engineOff();

 

 

보다시피 각 객체를 만든 뒤에 직접 기능을 불러와서 실행시키게됩니다. 기능이 많아지면 많아질수록 코드는 길어지고 복잡해지겠죠. 그래서 우리는 여기에 퍼사드 패턴을 입혀서 하나의 편리한 클래스를 만들 것 입니다.

public class CarFacade {
    MediaPlayer mediaPlayer = new MediaPlayer();
    Engine engine = new Engine();
    WindowControl windowControl = new WindowControl();

    public void turnOnAllSystem(){
        engine.engineOn();
        mediaPlayer.mediaPlayerOn();
        windowControl.windowOpen();
    }

    public void turnOffAllSystem(){
        windowControl.windowClose();
        mediaPlayer.mediaPlayerOff();
        engine.engineOff();
    }
}

 

 

이처럼 한 클래스에 모든 기능들을 몰아 넣어서, 실제로 사용할 클래스에선 간단한 호출로 사용할 수 있게 되었습니다.

public class FacadeMain {
    public static void main(String[] args) {
        CarFacade car = new CarFacade();

        car.turnOnAllSystem();
        car.turnOffAllSystem();
    }
}

 

결과적으로 보면 사용하지 않았을 때랑 큰 차이가 없는 것 같지만, 퍼사드 패턴은 서브 시스템의 편리한 사용을 제공한다는 패턴임을 생각해 본다면 굉장한 편의성을 제공하고 있습니다.


https://github.com/Bam-j/DesignPattern/tree/master/src/Facade

 

728x90

댓글