FIF's 코딩팩토리

퍼사드 패턴(Facade Pattern) 정리 본문

Back-End/Design Pattern(디자인 패턴)

퍼사드 패턴(Facade Pattern) 정리

FIF 2019. 6. 10. 14:15
반응형

퍼사드 패턴(Facade Pattern) 정의 

어떤 서브시스템의 일련의 인터페이스에 대한 통합된 인터페이스를 제공한다.

퍼사드에서 고수준 인터페이스를 정의하기 때문에 서브시스템을 더 쉽게 사용할 수 있다.

 

패턴을 사용할때는 항상 패턴이 어떤 용도로 쓰이는지를 잘 알아둬야 한다.

퍼사드 패턴은 단순화된 인터페이스를 통해 서브시템을 더 쉽게 사용할 수 있도록 하기 위한 용도로 쓰인다.

 

 

 

홈씨어터로 퍼사드 패턴 구현

전선과 프로젝터를 설치하고, 각 장치들을 케이블로 연결하는 등등 여러 인터페이스들이 나열되어 있다.

 

DVD영화를 보려면?

1.     팝콘 기계를 켠다. poper.on();

2.     팝콘 튀기기 시작. poper.pop()

3.     전등을 어둡게 조절. light.dim(10)

4.     스크린을 내린다. screen.down();

12. DVD 플레이어를 켠다. dvd.on();

 

13. DVD를 재생한다. dvd.play(movie);

 

이런식이면 영화를 끄기위해선 역순으로 진행해야 한다.

CD나 라디오를 들을 때도 이렇게 복잡하게 해야한다.

홈 씨어터 사용법이 너무 복잡하다.

 

이런 경우 퍼사드를 사용하면 된다.

퍼사드 패턴은 인터페이스를 단순화 시키기 위해서 인터페이스를 변경한다.

때문에, 훨씬 쓰기 쉬운 인터페이스를 제공하는 퍼사드 클래스를 구현함으로써, 복잡한 시스템을 훨씬 쉽게 사용할 수 있다.

 

HomeTheaterFaced.java

public class HomeTheaterFacade {
           Amplifier amp;
           Tuner tuner;
           Dvdplayer dvd;
           CdPlayer cd;
           Projector projector;
           TheaterLights lights;
           Screen screen;
           PopcornPopper popper;
           public HomeTheaterFacade( Amplifier amp,
                                                Tuner tuner, 
                                                DvdPlayer dvd,
                                                CdPlayer cd,
                                                Projector projector,
                                                Screen screen,
                                                TheaterLights lights,
                                                PopcornPopper popper) {
                    this.amp = amp;
                    this.tunner = tuner;
                    this.dvd = dvd;
                    this.cd = cd;
                    this.projector = projector;
                    this.screen = screen;
                    this.lights = lights;
                    this.popper = popper;
          }
          public void watchMovie (String movie) {
                    System.out.println("Get ready to watch a movie...");
                    popper.on();
                    popper.pop();
                    lights.dim(10);
                    screen.down();
                    projector.on();
                    projector.wideScreenMode();
                    amp.on();
                    amp.setDvd(dvd);
                    amp.setsurroundSound();
                    amp.setVolume(5);
                    dvd.on();
                    dvd.play(movie);
          }
          public void endMovie() {
                    System.out.println("Shutting movie theater down...");
                    popper.off();
                    lights.on();
                    screen.up();
                    projector.off();
                    amp.off();
                    dvd.stop();
                    dvd.eject();
                    dvd.off();
          }
 }

 

HomeTheaterTestDrive.java

public class HomeTheaterTestDrive {
         public static void main(String[] args) {
                    // instantiate components here
                    HomeTheaterFacade homeTheater  =
                               new HomeTheaterFacade(amp, tuner, dvd, cd, projector, screen, lights, popper);
                    homeTheater.watchMovie("타짜");
                    homeTheater.endMovie();
          }
}

 

어떤 서브 시스템에 속한 일련의 복잡한 클래스들을 단순화 하고 통합한 클래스를 만들어 퍼사드 패턴을 완성하였다.

이제 클라이언트와 서브시스템이 서로 긴밀하게 연결되지 않아도 되고, 최소 지식 원칙을 준수한는데도 도움을 준다

최소 지식 원칙.

정말 친한 친구하고만 얘기하라

                                  

어떤 객체든 그 객체와 상호작용 하는 클래스의 개수에 주의해야 하며, 그런 객체들과 어떤 식으로 상호작용을 하는지에도 주의를 기울어야 한다는 뜻이다.

 

어떻게 하면 여러 객체하고 인연 맺기를 피할 수 있을까?

어떤 메소드 에서든지 아래와 같은 네 종류 객체의 메소드만을 호출하면 된다.

1. 객체 자체

2. 메소드에서 매개변수로 전달된 객체

3. 그 메소드에서 생성하거나 인스턴스를 만든 객체

4. 그 객체에 속하는 구성요소

 

원칙을 따르지 않는 경우

public float getTemp() {
        //station으로부터 thermometer라는 객체를 받은 다음
       Thermometer thermometer = station.getThermometer(); // station 오로부터
        //그 객체의 getTemperature() 메소드를 직접 호출
         return thermometer.getTemperature();
}

 

원칙을 따르는 경우

public float getTemp() {
// Station 클래스에 thermometer에 요청을 해주는 메소드를 추가, 이렇게 하면 의존해야 하는 
// 클래스의 개수를 줄일 수 있다.
         return station.getTemperature();
}

 

public class Car {
         //이 클래스의 구성요소. 이 구성요소의 메소드는 호출해도 된다.
           Engine engine; 
           public Car() { }
         // 매개변수로 전달된 객체의 메소드는 호출해도 된다.
           public void start(Key key) {
         //새로운 객체 생성. 이 객체의 메소드는 호출해도 된다.
                     Doors doors = new Doors();
                        //매개변수로 전달된 객체의 메소드는 호출해도 된다.
                     boolean authorized = key.turns(); 
                     if ( authorized ) { 
                        // 이 객체의 구성요소의 메소드는 호출해도 된다.
                               engine.start(); 
                        // 객체 내에 있는 메소드는 호출해도 된다.
                               updateDashboardDisplay();              
                        //직접 생성하거나 인스턴스를 만든 객체의 메소드는 호출해도 된다.               
                               doors.lock(); 
                     }
           }
           public void updateDashboardDisplay() { }
 }

 

반응형
Comments