minstudio

파사드 패턴 (Facade)

파사드 패턴(Facade Pattern)은 건물의 웅장한 정면(Facade) 뒤로 복잡한 배관과 전선들이 숨겨져 있듯이, 복잡한 내부 서브시스템들을 뒤로 숨기고 사용하기 쉬운 단순한 통합 인터페이스 하나만을 제공하는 패턴입니다.

영화를 보기 위해 'TV 전원 켜기 -> 조명 어둡게 끄기 -> 스피커 볼륨 조절 -> 넷플릭스 실행' 등 클라이언트가 4개의 클래스를 직접 제어하는 대신, HomeTheaterFacade 클래스에 watchMovie()라는 메서드 하나만 만들어 복잡한 절차를 통합 위임합니다.

🏢 Facade: 복잡한 내부 시스템을 가리는 정면 창구 클라이언트 watchMovie() HomeTheaterFacade tv.on() light.dim() netflix.play() TV System Lighting System Netflix API 복잡하고 의존성 높은 서브시스템들
<!-- ==========================================
// 📂 Subsystems (복잡한 하위 시스템들)
// ==========================================

class TV {
    public void on() { System.out.println("TV 전원 켜기"); }
    public void off() { System.out.println("TV 전원 끄기"); }
}

class Lighting {
    public void dim() { System.out.println("조명 어둡게 낮추기"); }
    public void on() { System.out.println("조명 밝게 켜기"); }
}

class Netflix {
    public void playMovie(String title) { System.out.println("넷플릭스 '" + title + "' 재생 시작!"); }
}

// ==========================================
// 📂 HomeTheaterFacade.java (파사드 클래스)
// ==========================================
class HomeTheaterFacade {
    private TV tv;
    private Lighting lighting;
    private Netflix netflix;

    public HomeTheaterFacade(TV tv, Lighting lighting, Netflix netflix) {
        this.tv = tv;
        this.lighting = lighting;
        this.netflix = netflix;
    }

    // 클라이언트에게 제공하는 단 하나의 단순한 메서드!
    public void watchMovie(String movieTitle) {
        System.out.println("\n--- 영화 볼 준비를 시작합니다 ---");
        lighting.dim();
        tv.on();
        netflix.playMovie(movieTitle);
    }
    
    public void stopMovie() {
        System.out.println("\n--- 영화를 종료합니다 ---");
        tv.off();
        lighting.on();
    }
}

// ==========================================
// 📂 Main.java (사용 예시)
// ==========================================
public class Main {
    public static void main(String[] args) {
        // 원래 클라이언트가 이 3개를 직접 호출해야 해서 코드가 지저분해졌을 것입니다.
        TV tv = new TV();
        Lighting lighting = new Lighting();
        Netflix netflix = new Netflix();

        // 파사드 뒤로 복잡함을 숨깁니다.
        HomeTheaterFacade homeTheater = new HomeTheaterFacade(tv, lighting, netflix);

        // 클라이언트는 파사드의 직관적인 메서드 하나만 호출하면 끝!
        homeTheater.watchMovie("인터스텔라");
        homeTheater.stopMovie();
    }
}
파사드 패턴 (Facade) | Minstudio