ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Structural Patterns - 파사드(Facade) 파헤치기
    Java/디자인패턴 2024. 10. 24. 14:14
    반응형

     파사드(Facade) Pattern

    Facade 패턴은 복잡한 시스템을 단순화하여 사용자가 더 쉽게 접근할 수 있도록 하는 구조적 디자인 패턴입니다. 이 패턴은 여러 클래스나 서브시스템의 인터페이스를 통합하여 단일한 인터페이스를 제공함으로써, 클라이언트가 시스템의 복잡성을 이해하지 않고도 쉽게 사용할 수 있도록 합니다.

     

     

    주요 특징

    1. 간단한 인터페이스: 클라이언트는 복잡한 서브시스템의 세부사항을 알 필요 없이 간단한 메서드를 통해 기능을 사용할 수 있습니다.
    2. 결합도 감소: Facade 패턴을 사용하면 클라이언트와 서브시스템 간의 결합도를 줄일 수 있어, 시스템의 유지보수와 확장이 용이해집니다.
    3. 서브시스템의 보호: 클라이언트가 직접 서브시스템에 접근하지 않으므로, 서브시스템의 변경이 클라이언트에 미치는 영향을 줄일 수 있습니다.

    서브시스템 클래스들

    // 서브시스템 클래스들
    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();   // 영화 종료
        }
    }

    비교

    1. 복잡성:
      • 사용 전: 클라이언트 코드에서 모든 서브시스템의 메서드를 직접 호출해야 하므로, 복잡하고 코드가 길어집니다.
      • 사용 후: Facade 클래스를 통해 단순한 메서드 호출만으로 복잡한 작업을 수행할 수 있습니다.
    2. 가독성:
      • 사용 전: 각 기능을 호출하는 코드가 산재해 있어, 이해하기 어렵고 수정하기도 불편합니다.
      • 사용 후: watchMovie()와 endMovie() 같은 메서드가 클라이언트 코드에 명확한 의미를 부여하여 가독성이 높아집니다.
    3. 결합도:
      • 사용 전: 클라이언트가 서브시스템에 직접 의존하게 되어, 서브시스템 변경 시 클라이언트 코드도 수정해야 합니다.
      • 사용 후: Facade 패턴 덕분에 클라이언트는 Facade 인터페이스에만 의존하므로, 서브시스템 변경이 클라이언트에 미치는 영향을 줄일 수 있습니다.

    이처럼 Facade 패턴을 사용하면 시스템의 복잡성을 줄이고, 코드의 가독성과 유지보수성을 높일 수 있습니다.

    반응형

    댓글

Designed by Tistory.