8 Facade Pattern(퍼사드 패턴)
8.1 Facade Pattern 이란
Facade Pattern을 사용하는 목적은 단순합니다. 서브 시스템 클래스들을 통합해 더 쉽게 사용하기 위함이죠.
- Facade class는 서브 시스템 클래스들의 reference를 가집니다.
8.2 HomeTheaterFacade
간단한 예를 통해 Facade Pattern의 사용 목적을 보여드리겠습니다.
영화를 보기위해선(하나의 시스템) 프로젝터, DVD 플레이어, 영화관 조명, 스크린(서브 시스템)이 필요하죠.
이런 서브시스템들을 하나하나 조작해야한다면 번거로울 겁니다. 서브시스템들을 통합해서 한번에 조작할 수 있도록 해보죠.
영화를 보기위해서는
전등을 켜고 lights.on();
스크린을 내린 뒤 screan.down();
프로젝트를 켜고 projector.on();
Dvd를 켜고 dvd.on();
재생시켜야한다. dvd.play();
이러한 복잡한 과정을 Facade로 감싸서 단순화 시킨다.
theaterFacade.watchMovie();
8.2.1 Sub System class
서브 시스템 클래스들입니다. 이 서브 시스템들이 맞물려서 하나의 시스템을 구성하죠.
Projector class
| public class Projector { public void on() { System.out.println("projector on!"); } public void off() { System.out.println("projector off!"); } public void tvMode() { System.out.println("projector's TV mode!"); } public void wideScreanMode() { System.out.println("projector's Wide screan mode!"); } } | cs |
Screan class
| public class Screan { public void up() { System.out.println("screan up"); } public void down() { System.out.println("screan down"); } } | cs |
DvdPlayer class
| public class DvdPlayer { public void on() { System.out.println("DVD Player on!"); } public void off() { System.out.println("DVD Player off!"); } public void play() { System.out.println("play DVD!"); } public void pause() { System.out.println("pause DVD!"); } } | cs |
TheaterLights class
| public class TheaterLights { public void on() { System.out.println("Light on!"); } public void off() { System.out.println("Light off!"); } public void dim() { System.out.println("dim!"); } } | cs |
8.2.2 Facade class
서브 시스템 클래스들을 통합해줄 Facade class입니다.
일련의 과정을 단순화하여 쉽게 사용할 수 있도록 해주죠.
HomeTheaterFacade class
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | public class HomeTheaterFacade { DvdPlayer dvd; TheaterLights lights; Projector projector; Screan screan; public HomeTheaterFacade(DvdPlayer dvd, TheaterLights lights, Projector projector, Screan screan) { this.dvd = dvd; this.lights = lights; this.projector = projector; this.screan = screan; } public void watchMovie() { lights.on(); screan.down(); projector.on(); dvd.on(); dvd.play(); } public void endMovie() { lights.off(); screan.up(); projector.off(); dvd.off(); dvd.pause(); } } | cs |
8.2.3 Driver class
실행을 위한 클라이언트 클래스입니다.
HomeTheaterFacadeDrive class
| public class HomeTheaterFacadeDrive { public static void main(String[] args) { DvdPlayer dvd = new DvdPlayer(); TheaterLights lights = new TheaterLights(); Projector projector = new Projector(); Screan screan = new Screan(); HomeTheaterFacade homeTheater = new HomeTheaterFacade(dvd, lights, projector, screan); homeTheater.watchMovie(); homeTheater.endMovie(); } } | cs |