본문 바로가기
Delvelopment/DesignPattern

[Design Pattern] 퍼사드 패턴 (Facade Pattern)

by 제제킴 2022. 7. 3.
반응형

퍼사드 패턴(Facade Pattern은 서브시스템에 있는 일련의 인터페이스를 통합 인터페이스로 묶어 줍니다. 또한 고수준 인터페이스도 정의하므로 서브시스템을 더편리하게 사용할 수 잇습니다.

퍼사드는 인터페이스를 단순하게 만들고 클라이언트와 구성요소로 이루어진 서브시스템을 분리하는 역할도 한다. 퍼사드와 어댑터는 모두 여러 개의 클래스를 감쌀 수 있습니다. 하지만 퍼사드는 인터페이스를 단순하게 만드는 용도로 쓰이는 반면, 어댑터는 인터페이시를 다른 인터페이스로 변환하는 용도로 쓰입니다.

최소 지식 원칙 (Principle of Least Knowledge) 에 따라는 객체 사이의 상호작용은 될 수 있으면 아주 가까운 친구 사이에서만 허용하는 편이 좋다.

이 원칙을 잘 따르면 여러 클래스가 복잡하게 얽혀 있어서, 시스템의 한 부분을 변경했을 때 다른 부분까지 줄줄이 고쳐야 하는 상황을 미리 방지할 수 있다. 여러 클래스가 서로 복잡하게 의존하고 있다면 관리하기도 힘들고 남들이 이해하기 어려운 불정안정한 시스템이 만들어 집니다.

해드퍼스트 디자인패턴

package pattern.facade;

public class HomeTheaterFacade {

    Amplifier amp;
    Turer turer;
    StreamingPlayer player;
    Projector projector;
    TheaterLights lights;
    Screen screen;
    PopcornPopper popper;

    public HomeTheaterFacade(Amplifier amp, Turer turer, StreamingPlayer player, Projector projector, TheaterLights lights, Screen screen, PopcornPopper popper) {
        this.amp = amp;
        this.turer = turer;
        this.player = player;
        this.projector = projector;
        this.lights = lights;
        this.screen = screen;
        this.popper = popper;
    }

    public void watchMovie(String movie) {
        System.out.println("영화 볼 준비 중");
        popper.on();
        popper.pop();
        lights.dim(10);
        screen.down();
        projector.on();
        projector.wideScreenMode();
        amp.on();
        amp.setStreamingPlayer(player);
        amp.setSurrondSound();
        amp.setVolume(5);
        player.on();
        player.play(movie);
    }

    public void endMovie() {
        System.out.println("홈시어터를 끄는 중");
        popper.off();
        lights.on();
        screen.up();
        projector.off();
        amp.off();
        player.stop();
        player.ofF();

    }
}
package pattern.facade;

public class Amplifier {

    StreamingPlayer player;
    int volume;

    public void on() {
        System.out.println("앰프가 켜졌습니다.");
    }

    public void setStreamingPlayer(StreamingPlayer player) {
        this.player = player;
        System.out.println("앰프를 스트리밍 플레이어와 연결합니다..");
    }

    public void setSurrondSound() {
        System.out.println("엠프를 서라운드 모드로 설정합니다(5.1채널)");
    }

    public void setVolume(int i) {
        this.volume = i;
        System.out.println("앰프 볼륨을 5로 설정합니다..");
    }

    public void off() {
        System.out.println("앰프가 꺼졌습니다.");
    }
}
package pattern.facade;

public class Turer {
}
package pattern.facade;

public class StreamingPlayer {
    String movie;

    public void on() {
        System.out.println("스트리밍 플레이어가 켜졌습니다.");
    }

    public void play(String movie) {
        this.movie = movie;
        System.out.println("스트리밍 플에이어에서" + movie + "를 재생합니다");
    }

    public void stop() {
        System.out.println("스트리밍 플에이어에서 \\"" + movie + "\\" 재생을 종료합니다.");
    }

    public void ofF() {
        System.out.println("스트리밍 플레이어가 꺼졌습니다.");
    }
}
package pattern.facade;

public class Projector {
    public void on() {
        System.out.println("프로젝터가 켜졌습니다.");
    }

    public void wideScreenMode() {
        System.out.println("프로젝터 화면 비율을 와이드 모드로 설정합니다(16:9).");
    }

    public void off() {
        System.out.println("프로젝터가 꺼졌습니다.");
    }
}
package pattern.facade;

public class TheaterLights {

    int dim;

    public void dim(int i) {
        this.dim = i;
        System.out.println("조명 밝기를 10%로 설정합니다.");
    }

    public void on() {
        this.dim = 100;
        System.out.println("조명이 켜졌습니다.");
    }
}
package pattern.facade;

public class Screen {
    public void down() {
        System.out.println("스크린이 내려옵니다.");
    }

    public void up() {
        System.out.println("스크린이 올라갑니다.");
    }
}
package pattern.facade;

public class PopcornPopper {
    public void on() {
        System.out.println("팝콘 기계가 켜졌습니다.");
    }

    public void pop() {
        System.out.println("팝콘 기계가 꺼졌습니다.");
    }

    public void off() {
        System.out.println("팝콘 기계에서 팝콘을 튀기고 있습니다.");
    }
}
package pattern.facade;

public class HomeTheaterTestDrive {

    public HomeTheaterTestDrive() {
        Amplifier amp = new Amplifier();
        Turer turer = new Turer();
        StreamingPlayer player = new StreamingPlayer();
        Projector projector = new Projector();
        Screen screen = new Screen();
        TheaterLights lights = new TheaterLights();
        PopcornPopper popper = new PopcornPopper();

        HomeTheaterFacade homeTheater = new HomeTheaterFacade(amp, turer, player, projector, lights, screen, popper);

        homeTheater.watchMovie("인디아나 존스: 레이더스");
        homeTheater.endMovie();
    }
}
반응형

댓글