본문 바로가기
SWE/C++ OOP

[디자인패턴] Facade Pattern 퍼사드 패턴

by S나라라2 2021. 9. 29.
반응형

Facade Pattern 퍼사드 패턴

 

개념

퍼사드 패턴이란 여러 서브 시스템의 작업들을 하나의 인터페이스로 통합하여 제공해주는 것이다. 

 

예시

예를 들어 집에서 영화보는 것에 대해 생각해보자

영화를 보려고 하면 여러가지 사전 작업들이 필요하다.

빔 프로젝터를 켜고, 스크린을 내리고, 조명 밝기를 조절하고 등...

이 여러가지 작업들은 영화를 볼 때마다 반복적으로 수행되어야 하는데, 이들을 하나로 묶어서 인터페이스로 제공하는 것이 퍼사드 패턴이다.

public void watchMovie(String movie)
{
	projector.on();
    screen.down();
    lights.dim(10);
    ...
}

 

퍼사드 클래스의 형태

위의 watchMovie 메소드는 HomeTheaterFacade라는 퍼사드 클래스에 속해 있을 것이다.

HomeTheaterFacade 클래스는 우리가 사용하고자 하는 서브 시스템의 모든 구성 요소들을 인스턴스 변수 형태로 저장하고 있다.

public class HomeTheaterFacade
{
	Projector projector;
    Screen screen;
    TheaterLight lights;
    ...
    
    public HomeTheaterFacade( Projector projector,
    							Screen screen,
                                TheaterLight lights,
                                ...
                                )
    {
    		this.projector = projector;
    		this.screen = screen;
            this.lights = lights;
            ...
    }
}

퍼사드는 생성자에서 서브시스템의 각 레퍼런스를 인스턴스 변수에 저장한다.

 

 

퍼사드 패턴의 장점

 

퍼사드 패턴은 이게 끝이다. 

상속이나 구성도 없고 트리키한 구조가 없기 때문에 이해가 쉽다. 매우 단순하다.

 

근데 실제 코드에서는 자주 사용되는 것 같다.

나의 경우 코드의 반복성을 줄이기 위해서도 퍼사드 패턴을 자주 사용한다. 

예를 들어 비가 오는 날, 친구가 집에 놀러온 날, 자유 시간이 생긴 날 등 여러 조건에서 영화보는 작업이 수행될 수 있다. 이럴 때 퍼사드 패턴의 인터페이스 단 하나만 호출하면 되기 때문에 자주 사용된다.

 

장점1. 사용이 간편하다.

클라이언트 입장에서는 각 서브 시스템들(lights, projector, dvd, ...)을 하나하나 호출할 필요가 없이 HomeTheaterFacade 하나만 호출하면 된다.

 

장점2. 유연성이 좋다.

클라이언트와 서브시스템이 서로 긴밀하게 연결되어 있지 않기 때문에 서브시스템에 변화가 있을 때 클라이언트에 영향이 가지 않는다. 

예를 들어 빔프로젝터 제품을 변경하거나 DVD제품을 새로 사더라도 클라이언트 코드는 수정할 필요가 없다.

 

 

퍼사드 패턴 명칭의 어원

보통 디자인 패턴의 명칭을 보면 어떤 개념인지 이름에 나타난다. 그러나 퍼사드 패턴은 무슨 의미인지 모르겠어서 찾아봤다.

Facade는 건물의 외관을 의미한다고 한다.

아래 이미지를 보면 울타리 안에는 여러가지 장비, 설비, 건물들이 있다.

클라이언트는 이걸 동작시키기 위해 모든 장비에 일일이 방문할 필요 없이, 건물의 외관 하나를 통해서 간단히 작동시킬 수 있다.

 

그리고 안에 장비 하나를 새로 교체하더라도 클라이언트의 동작에는 영향을 끼치지 않는 것을 볼 수 있다.

 

출처: refactoring guru

 

반응형