-
Structural Patterns - 파사드(Facade) 파헤치기Java/디자인패턴 2024. 10. 24. 14:14반응형
파사드(Facade) Pattern
Facade 패턴은 복잡한 시스템을 단순화하여 사용자가 더 쉽게 접근할 수 있도록 하는 구조적 디자인 패턴입니다. 이 패턴은 여러 클래스나 서브시스템의 인터페이스를 통합하여 단일한 인터페이스를 제공함으로써, 클라이언트가 시스템의 복잡성을 이해하지 않고도 쉽게 사용할 수 있도록 합니다.
주요 특징
- 간단한 인터페이스: 클라이언트는 복잡한 서브시스템의 세부사항을 알 필요 없이 간단한 메서드를 통해 기능을 사용할 수 있습니다.
- 결합도 감소: Facade 패턴을 사용하면 클라이언트와 서브시스템 간의 결합도를 줄일 수 있어, 시스템의 유지보수와 확장이 용이해집니다.
- 서브시스템의 보호: 클라이언트가 직접 서브시스템에 접근하지 않으므로, 서브시스템의 변경이 클라이언트에 미치는 영향을 줄일 수 있습니다.
서브시스템 클래스들
// 서브시스템 클래스들 class Amplifier { public void on() { System.out.println("Amplifier is on"); } public void setVolume(int level) { System.out.println("Setting volume to " + level); } public void off() { System.out.println("Amplifier is off"); } } class Projector { public void on() { System.out.println("Projector is on"); } public void setInput(String input) { System.out.println("Setting input to " + input); } public void off() { System.out.println("Projector is off"); } } class Screen { public void down() { System.out.println("Screen is down"); } public void up() { System.out.println("Screen is up"); } }
Facade 패턴 사용 전
public class HomeTheaterTest { public static void main(String[] args) { // 서브시스템 객체 생성 Amplifier amp = new Amplifier(); Projector proj = new Projector(); Screen scr = new Screen(); // 영화 보기 과정 System.out.println("Getting ready to watch a movie..."); scr.down(); // 스크린 내리기 proj.on(); // 프로젝터 켜기 proj.setInput("DVD"); // 입력 설정 amp.on(); // 앰프 켜기 amp.setVolume(5); // 볼륨 설정 System.out.println("Movie is ready to watch!"); // 영화 종료 과정 System.out.println("Shutting down..."); proj.off(); // 프로젝터 끄기 amp.off(); // 앰프 끄기 scr.up(); // 스크린 올리기 } }
Facade 패턴 사용 후
// Facade 클래스 class HomeTheaterFacade { private Amplifier amplifier; private Projector projector; private Screen screen; public HomeTheaterFacade(Amplifier amp, Projector proj, Screen scr) { this.amplifier = amp; this.projector = proj; this.screen = scr; } public void watchMovie() { System.out.println("Getting ready to watch a movie..."); screen.down(); projector.on(); projector.setInput("DVD"); amplifier.on(); amplifier.setVolume(5); System.out.println("Movie is ready to watch!"); } public void endMovie() { System.out.println("Shutting down..."); projector.off(); amplifier.off(); screen.up(); } } // 클라이언트 코드 public class HomeTheaterTest { public static void main(String[] args) { Amplifier amp = new Amplifier(); Projector proj = new Projector(); Screen scr = new Screen(); HomeTheaterFacade homeTheater = new HomeTheaterFacade(amp, proj, scr); homeTheater.watchMovie(); // 영화 보기 시작 homeTheater.endMovie(); // 영화 종료 } }
비교
- 복잡성:
- 사용 전: 클라이언트 코드에서 모든 서브시스템의 메서드를 직접 호출해야 하므로, 복잡하고 코드가 길어집니다.
- 사용 후: Facade 클래스를 통해 단순한 메서드 호출만으로 복잡한 작업을 수행할 수 있습니다.
- 가독성:
- 사용 전: 각 기능을 호출하는 코드가 산재해 있어, 이해하기 어렵고 수정하기도 불편합니다.
- 사용 후: watchMovie()와 endMovie() 같은 메서드가 클라이언트 코드에 명확한 의미를 부여하여 가독성이 높아집니다.
- 결합도:
- 사용 전: 클라이언트가 서브시스템에 직접 의존하게 되어, 서브시스템 변경 시 클라이언트 코드도 수정해야 합니다.
- 사용 후: Facade 패턴 덕분에 클라이언트는 Facade 인터페이스에만 의존하므로, 서브시스템 변경이 클라이언트에 미치는 영향을 줄일 수 있습니다.
이처럼 Facade 패턴을 사용하면 시스템의 복잡성을 줄이고, 코드의 가독성과 유지보수성을 높일 수 있습니다.
반응형'Java > 디자인패턴' 카테고리의 다른 글
템플릿 메소드 패턴(Template Method Pattern) (0) 2024.11.07 Behavioral Design Pattern - Strategy(전략) 파헤치기 (0) 2024.10.25 SOLID - Dependency inversion (의존성 역전법칙)파헤치기 (0) 2024.10.22 SOLID - Interface segregation(인터페이스 분리법칙) 파헤치기 (1) 2024.10.22 SOLID - Liskov substitution 리스코프 치환원칙 파헤치기 (0) 2024.10.22