반응형
Notice
Recent Posts
Recent Comments
관리 메뉴

꿈꾸는 사람.

[디자인 패턴][퍼사드 패턴] 클라이언트를 복잡한 시스템과 분리. 본문

IT/Language_Design Patterns

[디자인 패턴][퍼사드 패턴] 클라이언트를 복잡한 시스템과 분리.

현무랑 니니 2016. 1. 27. 17:28
반응형

퍼사드 패턴을 이해하기 위해 실 생활의 예를 살펴보자.

홈 씨어터는 DVD 플레이어, CD 플레이어, 프로젝터, 자동 스크린, 서라운드 음향 등으로 이루어져 있다.

홈 씨어터의 각 장치들은 전원과 케이블로 연결되어야 한다.

그리고 영화를 보기 위해 해야 할 일들을 나열해 보자.

  1. 전등을 어둡게 조절
  2. 스크린을 내린다.
  3. 프로젝터를 켠다.
  4. 프로젝터로 DVD 신호가 입력되게 한다.
  5. 프로젝터를 와이드 스크린 모드로 전환한다.
  6. 앰프를 켠다.
  7. 앰프 입력을 DVD로 전환한다.
  8. 앰프를 서라운드 음향 모드로 전환한다.
  9. 앰프 볼륨을 중간(5)으로 설정한다.
  10. DVD 플레이어를 켠다.
  11. DVD를 재생한다.

(시스템 구성이 복잡할 수록 조작이 어려워진다.)


이런 복잡한 일을 간단히 처리하기 위해 퍼사드 패턴을 이용해 보자.


1. 퍼사드 패턴 (Facade Pattern)의 정의

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

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


  • 퍼사드 패턴은 단순화된 인터페이스를 통해 서브시스템을 더 쉽게 사용할 수 있게 한다.
  • 퍼사드는 클라이언트를 복잡한 서브 시스템과 분리시켜주는 역할을 한다.
  • 퍼사드 패턴은 서브시스템으로 퍼사드를 만들고, 실제 작업은 서브클래스가 담당하게 한다.
  • 서브시스템에서도 최소 지식 원칙을 최대한 적용한다.
  • 어댑터는 객체를 감싸서 인터페이스를 바꾸기 위한 용도로, 데코레이터는 객체를 감싸서 새로운 행동을 추가하기 위한 용도로, 퍼사드는 일련의 객체를 감싸서 단순화시키기 위한 용도롤 쓰인다.

디자인 원칙

최소 지식 원칙(Principle of Least Knowledge) - 정말 친한 친구들하고만 대화하라. (Only talk to your friends.)


시스템을 디자인할 때 객체와 상호작용 하는 클래스를 최소화하는 것이 유지,보수에 유리하다.

최소 지식 원칙을 위한 지침은 다음 네 종류의 객체의 메소드만 호출하는 것이다.

- 객체 자체

- 메소드에 매개변수로 전달된 객체

- 그 메소드에서 생성하거나 인스턴스화한 객체

- 그 객체에 속하는 구성요소


2. 퍼사드 패턴 (Facade Pattern)의 예.


headfirst의 홈 씨어터 퍼사드 코드

package headfirst.facade.hometheater; 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.tuner = 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(); } public void listenToCd(String cdTitle) { System.out.println("Get ready for an audiopile experence..."); lights.on(); amp.on(); amp.setVolume(5); amp.setCd(cd); amp.setStereoSound(); cd.on(); cd.play(cdTitle); } public void endCd() { System.out.println("Shutting down CD..."); amp.off(); amp.setCd(cd); cd.eject(); cd.off(); } public void listenToRadio(double frequency) { System.out.println("Tuning in the airwaves..."); tuner.on(); tuner.setFrequency(frequency); amp.on(); amp.setVolume(5); amp.setTuner(tuner); } public void endRadio() { System.out.println("Shutting down the tuner..."); tuner.off(); amp.off(); } }

-. 홈 씨어터 시스템용 퍼사드, HomeTheaterFacade 클래스를 만들고 watchMovie() 메소드로 복잡한 영화 보는 것을 간단히 처리한다.


headfirst의 홈 씨어터 퍼사드 테스트 코드

package headfirst.facade.hometheater; public class HomeTheaterTestDrive{ public static void main(String[] args) { Amplifier amp = new Amplifier("Top-O-Line Amplifier"); Tuner tuner = new Tuner("Top-O-Line AM/FM Tuner", amp); DvdPlayer dvd = new DvdPlayer("Top-O-Line DVD Player", amp); CdPlayer cd = new CdPlayer("Top-O-Line CD Player", amp); Projector projector = new Projector("Top-O-Line Projector", dvd); TheaterLights lights = new TheaterLights("Theater Ceiling Lights"); Screen screen = new Screen("Theater Screen"); PopcornPopper popper = new PopcornPopper("Popcorn Popper"); HomeTheaterFacade homeTheater = new HomeTheaterFacade (amp, tuner, dvd, cd, projector, screen, lights, popper); homeTheater.watchMovie("Raiders of the Lost Ark"); homeTheater.endMovie(); } }

홈 씨어터 퍼사드를 테스트할 코드로 구성요소들을 직접 생성한다.

클라이언트에 퍼사드가 주어지기 때문에 직접 구성요소들을 생성하지 않아도 된다.

이 코드에서는 서브시스템의 구성요소들을 매개변수로 전달해서 퍼사드 인스턴스를 만든다.

이 테스트 코드는 퍼사드의 watchMovie(), endMovie() 메소드를 호출해 영화를 보고 홈 씨어터를 끈다.


출처: 헤드퍼스트 디자인 패턴


반응형
Comments