2015년 10월 5일 월요일

클래스 디자인 패턴 7-2. Facade Pattern_

1. 개념잡기
    뭔가 여러가지 기능을 하는 인스턴트들이 있는데 목표로 하는
     작업을 위해서 이들 인스턴트의 몇개의 작업이 조합되어야
     할때 이를 편하게 묶는 작업정도라고 보면 되겠다.

3. 소스
  1) 만들어져 있는 서브 인스턴트들
       실제 메서드가 더 많겠지만 watchMovie 메서드를
       실행시킬때 에러만 안나게끔 작성함.

 
package homeMeterial;

public class Amplifier {

 public void on() {
  System.out.println("앰프를 켠다.");
 }

 public void setDvd(DvdPlayer dvd) {
  System.out.println("입력단자를 dvd로 연결한다.");
  dvd.getInputClient();
 }

 public void setSurroundSound() {
  System.out.println("앰프 모드를 서라운드로 설정한다.");
 }

 public void setVolumn(int i) {
  System.out.println("앰프 음악 볼륨을 조절한다. 볼륨값은 max10중 "+i);
 }
}

 
package homeMeterial;

public class CdPlayer {
}


package homeMeterial;

public class DvdPlayer {

 public void getInputClient() {
  // TODO Auto-generated method stub
  System.out.println("DVD 음향 입력단자를 연결완료");
 }

 public void on() {
  System.out.println("DVD를 켠다.");
 }

 public void play(String movie) {
  System.out.println("DVD로 영화를 플레이한다 영화제목은 :"+movie);
 }

}


package homeMeterial;

public class Projector {

 public void on() {
  System.out.println("프로젝트 on");
 }

 public void wideScreenMove() {
  System.out.println("프로젝트 모드를 와이드 모드로 변환");
 }
}


package homeMeterial;

public class PrpcornPopper {

 public void on() {
  System.out.println("팝콘 기계 on");
 }

 public void pop() {
  System.out.println("팝콘이 튀겨지는걸 감상한다.");
 }
}


package homeMeterial;

public class Screen {

 public void down() {
  System.out.println("스크린을 내린다.");
 }
}


package homeMeterial;

public class TheaterLights {
 public void dim(int i) {
  System.out.println("전등 밝기 조절 밝니는 max100중에 "+i);
 }
}


package homeMeterial;

public class Tuner {
}


  2) 목표로 하는 작업 인터페이스 작성
      여기서 약 8가지 정도되는 인터페이스를 하나의 작업으로
      묶어서 관리하고 있다. 이를 퍼사드 패턴으로 보면 됨

 
package runTheater;

import homeMeterial.Amplifier;
import homeMeterial.CdPlayer;
import homeMeterial.DvdPlayer;
import homeMeterial.Projector;
import homeMeterial.PrpcornPopper;
import homeMeterial.Screen;
import homeMeterial.TheaterLights;
import homeMeterial.Tuner;

public class HomeTheaterFacade {
 Amplifier amp;
 Tuner tuner;
 DvdPlayer dvd;
 CdPlayer cd;
 Projector projector;
 TheaterLights lights;
 Screen screen;
 PrpcornPopper popper;
 
 public HomeTheaterFacade(Amplifier amp, Tuner tuner, DvdPlayer dvd,
   CdPlayer cd, Projector projector, TheaterLights lights,
   Screen screen, PrpcornPopper 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("집에서 영화를 보려면 이렇게 준비하고 봐야지");
  popper.on();
  popper.pop();
  lights.dim(10);
  screen.down();
  projector.on();
  projector.wideScreenMove();
  amp.on();
  amp.setDvd(dvd);
  amp.setSurroundSound();
  amp.setVolumn(5);
  dvd.on();
  dvd.play(movie);
  System.out.println("준비가 끝났으니 영화를 봅시다."); 
 }
}


  3) 테스트 코드
      여기서는 팝콘 기계를 켜고 할 필요없이
      watchMovie(영화제목) 메서드를 통해서
      하단의 여러 메서드를 한번에 실행시킬 수 있음.


 
package testFacade;

import runTheater.HomeTheaterFacade;
import homeMeterial.Amplifier;
import homeMeterial.CdPlayer;
import homeMeterial.DvdPlayer;
import homeMeterial.Projector;
import homeMeterial.PrpcornPopper;
import homeMeterial.Screen;
import homeMeterial.TheaterLights;
import homeMeterial.Tuner;

public class HomeTheaterTestDrive {
 public static void main(String[] args) {

  Amplifier amp = new Amplifier();
  Tuner tuner= new Tuner();
  DvdPlayer dvd=new DvdPlayer();
  CdPlayer cd=new CdPlayer();
  Projector projector=new Projector();
  TheaterLights lights=new TheaterLights();
  Screen screen=new Screen();
  PrpcornPopper popper=new PrpcornPopper();
  
  HomeTheaterFacade homeTheater = new HomeTheaterFacade(amp, tuner, dvd, cd, projector, lights , screen, popper);
  
  homeTheater.watchMovie("Prison Breaker");
 }
}


3. 다이어그램

댓글 없음:

댓글 쓰기