반응형
퍼사드 패턴(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();
}
}
반응형
'Delvelopment > DesignPattern' 카테고리의 다른 글
[Design Pattern] 반복자 패턴 (Iterator Pattern) (0) | 2022.07.09 |
---|---|
[Design Pattern] 팩토리 메소드 패턴 (Factory Method Pattern) (0) | 2022.07.03 |
[Design Pattern] 적응자 패턴 (Adapter Pattern) (0) | 2022.07.03 |
[Design Pattern] 커맨드 패턴 (Command Pattern) (0) | 2022.07.03 |
[Design Pattern] 템플릿 메서드 패턴 (Template Method Pattern) (0) | 2022.07.03 |
댓글