Intro::
디자인 패턴 중 구조 패턴인 퍼사드 패턴에 대해 알아봅시다.
퍼사드 패턴이란?
퍼사드 패턴의 기본 목적은 복잡한 시스템을 더 쉽게 사용할 수 있도록 외부에서 보는 인터페이스를 단순화하는 것입니다. 이 패턴을 사용하면 시스템과 상호작용하는 클라이언트는 필요한 기능만을 제공하는 '퍼사드'라는 단일 클래스를 통해 복잡한 서브시스템과 소통할 수 있습니다.
장점
•
단순성: 클라이언트는 복잡한 서브시스템과 직접 상호작용할 필요 없이, 퍼사드를 통해 필요한 기능을 쉽게 사용할 수 있습니다.
•
유지보수성: 시스템의 내부 구현이 변경되어도, 퍼사드 인터페이스는 그대로 유지할 수 있어 클라이언트 코드의 변경을 최소화할 수 있습니다.
•
분리와 캡슐화: 시스템의 복잡한 부분은 퍼사드 뒤에 캡슐화되어, 시스템의 나머지 부분과의 의존성이 감소합니다.
단점
•
과도한 단순화: 퍼사드가 제공하는 인터페이스가 너무 단순화되어 있으면, 클라이언트가 서브시스템의 보다 세밀한 기능을 필요로 할 때 직접 접근할 필요가 있을 수 있습니다. 이는 퍼사드 패턴의 목적을 약화시킬 수 있습니다.
•
퍼사드의 의존성: 시스템이 퍼사드에 지나치게 의존하게 되면, 퍼사드 클래스가 시스템의 병목 지점이 되거나 과부하 될 위험이 있습니다.
코드 예시
// 서브시스템 클래스 1: DVDPlayer
class DVDPlayer {
void on() {
System.out.println("DVD 플레이어가 켜졌습니다.");
}
void play(String movie) {
System.out.println(movie + " 재생을 시작합니다.");
}
void off() {
System.out.println("DVD 플레이어가 꺼졌습니다.");
}
}
// 서브시스템 클래스 2: Projector
class Projector {
void on() {
System.out.println("프로젝터가 켜졌습니다.");
}
void off() {
System.out.println("프로젝터가 꺼졌습니다.");
}
}
// 서브시스템 클래스 3: Screen
class Screen {
void down() {
System.out.println("스크린이 내려갑니다.");
}
void up() {
System.out.println("스크린이 올라갑니다.");
}
}
// 퍼사드 클래스: HomeTheaterFacade
class HomeTheaterFacade {
private DVDPlayer dvdPlayer;
private Projector projector;
private Screen screen;
public HomeTheaterFacade(DVDPlayer dvdPlayer, Projector projector, Screen screen) {
this.dvdPlayer = dvdPlayer;
this.projector = projector;
this.screen = screen;
}
public void watchMovie(String movie) {
System.out.println("영화를 보기 위해 홈 시어터를 설정합니다.");
screen.down();
projector.on();
dvdPlayer.on();
dvdPlayer.play(movie);
}
public void endMovie() {
System.out.println("영화 시청을 종료합니다.");
dvdPlayer.off();
projector.off();
screen.up();
}
}
// 클라이언트 코드
public class Main {
public static void main(String[] args) {
DVDPlayer dvd = new DVDPlayer();
Projector projector = new Projector();
Screen screen = new Screen();
HomeTheaterFacade homeTheater = new HomeTheaterFacade(dvd, projector, screen);
homeTheater.watchMovie("기생충");
homeTheater.endMovie();
}
}
Java
복사