Facade

GamSa Ham·2022년 10월 24일
0

GoF디자인패턴

목록 보기
8/22

10. 파사드(FACADE)

1. 의도

  • 복잡한 과정을 간단하게 제공
  • 한 서브시스템 내의 인터페이스 집합에 대한 획일화된 하나의 인터페이스를 제공하는 패턴
  • 서브시스템을 사용하기 쉽도록 상위 수준의 인터페이스를 정의

2. 동기

  • (시스템 → 서브시스템으로 구조화) → 복잡성을 줄인다
  • 공통적인 설계 목표 : 서브시스템들 사이의 의사소통 + 종속성을 최소화하는 것
  • 즉, 서브시스템의 일반적인 기능에 대한 단순화된 하나의 인터페이스를 제공하려는 것

3. 활용성

  • ① 복잡한 서브시스템에 대한 단순한 인터페이스 제공이 필요할 때
    • 시스템 범위 확장 → 서브시스템도 복잡해집니다
    • 패턴을 적용 → 확장성을 고려하여 설계 → 작은 클래스가 만들어집니다
    • 이런 과정은
      • 서브시스템을 재사용 가능한 것으로 만듬
      • 재정의할 수 있는 단위가 되도록 해 주기도 함
    • 실제 이런 세부사항을 모두 이해하면서 사용하는 것은 어려운 일이다!!
  • ② 추상 개념에 대한 구현 클래스와 사용자 사이에 너무 많은 종속성이 존재할 때
    • 퍼사드를 통해 사용자 + 다른 서브시스템 간의 결합도를 줄일 수 있습니다
    • 메서드 호출을 단순한 형태로 통합하여 제공하고
    • 나머지 부분은 내부적으로 처리함으로써
    • 사용자와 서브시스템 사이의 호출 횟수는 실질적으로 감소하게 되는 효과를 갖습니다
  • ③ 서브시스템을 계층화시킬 때
    • 각 서브시스템의 계층에 대한 접근점을 제공합니다.
    • 서브시스템이 다른 서브시스템에 종속적이라 하더라도 각자가 제공하는 퍼사드를 통해서만 대화를 진행하게 함으로써 종속성을 줄일 수 잇습니다.
    • 이로써 서브시스템 내부 설계의 변경이 다른 서브시스템에 독립적으로 자유롭게 될 수 있습니다

4. 참여자

  • 퍼사드
    • 단순하고 일관된 통합 인터페이스를 제공하며
    • 서브시스템을 구성하는 어떤 클래스가 어떤 요청을 처리해야 하는지 알고 있으며
    • 사용자의 요청을 해당 서브시스템 객체에 전달합니다.
  • 서브시스템 클래스들
    • 서브시스템의 기능을 구현하고
    • 퍼사드 객체로 할당된 작업을 실제로 처리하지만 퍼사드에 대한 정보는 없습니다.
    • 이들에 대한 어떤 참조자도 가지고 있지 않습니다.
  • 구조

5. 결과

  • 퍼사드 패턴을 사용하면 다음과 같은 이득을 얻습니다.
    • 서브시스템의 구성요소를 보호할 수 있습니다.
      • 사용자가 다루어야 할 객체의 수가 줄어들며,
      • 서브시스템을 쉽게 사용할 수 있습니다.
    • 서브시스템과 사용자 코드 간의 결합도를 더욱 약하게 만듭니다.
      • 서브시스템 내 정의된 요소들은 강하게 결합될 수 있습니다.
      • 서브시스템과 사용자 간의 결합이 약하면, 서브시스템 내의 요소를 다양화하는 작업을 원활하게 할 수 있습니다.
    • 퍼사드를 쓸지 서브시스템 클래스를 직접 사용할지 결정할 수 있습니다.
      • 응용프로그램 쪽에서 서브시스템 클래스를 사용하는 것을 완전히 막지는 않기 때문입니다. (?)

6. 구현

  • 고려할 사항
    • 사용자와 서브시스템 간의 결합도 줄이기
    • 서브시스템 클래스 중 공개할 것과 감출 것
  • 응용 프로그램
    package facade;
    
    import facade.system.Facade;
    
    public class Application {
        public static void main(String[] args) {
            Facade facade = new Facade();
            facade.process();
        }
    }
  • 퍼사드
    package facade.system;
    
    public class Facade {
    
        private SubSystem01 subSystem01;
        private SubSystem02 subSystem02;
        private SubSystem03 subSystem03;
    
        public Facade(){
            subSystem01 = new SubSystem01();
            subSystem02 = new SubSystem02();
            subSystem03 = new SubSystem03();
        }
    
        public void process(){
            subSystem01.process();
            subSystem02.process();
            subSystem03.process();
    
        }
    }
    • 서브시스템
      package facade.system;
      
      class SubSystem01 {
          public SubSystem01(){
              System.out.println("Call Constructor : " + getClass().getSimpleName());
          }
      
          public void process(){
              System.out.println("Call Process : "+ getClass().getSimpleName());
          }
      }
      
profile
안녕하세요. 자바를 좋아하고 디자인 패턴, Refactoring, Clean Code에 관심이 많은 백엔드 개발자입니다.

0개의 댓글