퍼사드 패턴

정선호·2023년 5월 23일
0

Design Patterns

목록 보기
16/24

관련 영상

퍼사드 패턴

위키피디아 - 퍼사드 패턴
설명 및 스도코드

  • 라이브러리, 프레임워크 또는 다른 클래스들의 복잡한 집합에 대한 단순화된 인터페이스를 제공하는 구조적 디자인 패턴
    • 소프트웨어 라이브러리를 쉽게 사용하고 쉽게 이해할 수 해준다. 또한 공통적인 작업에 대해 간편한 메소드들을 제공해준다
    • 라이브러리를 사용하는 코드들을 좀 더 읽기 쉽게 해준다
    • 라이브러리 바깥쪽의 코드가 라이브러리 안쪽 코드에 의존하는 일을 감소시켜 준다. 대부분의 바깥쪽의 코드가 퍼사드를 이용하기 때문에 시스템을 개발하는 데 있어 유연성이 향상된다
    • 좋게 작성되지 않은 API의 집합을 하나의 좋게 작성된 API로 감싸준다

퍼사드 패턴의 구조

  • 퍼사드(Facade)
    • 하위 시스템 기능들의 특정 부분에 편리하게 접근할 수 있다.
    • 퍼사드는 클라이언트의 요청을 어디로 보내야 하는지와 움직이는 모든 부품을 어떻게 작동해야 하는지를 알고 있다
  • 추가적인 퍼사드(Additional Facade)
    • 하나의 퍼사드를 관련 없는 기능들로 오염시켜 복잡한 구조로 만드는 것을 방지할 수 있다
    • 추가 퍼사드들은 클라이언트와 다른 퍼사드들 모두에 사용 가능
  • 복잡한 하위 시스템(Subsystem)
    • 퍼사드의 존재를 인식하지 못함
  • 클라이언트(Client)
    • 하위 시스템 객체들을 직접 호출하는 대신 퍼사드를 사용

퍼사드 패턴의 적용

  • 복잡한 하위 시스템에 대한 제한적이지만 간단한 인터페이스가 필요할 때
  • 하위 시스템을 계층들로 구성하려는 경우
    • 하위 시스템의 각 계층에 대한 진입점을 정의하기 위해 퍼사드 패턴 생성
    • 여러 하위시스템이 퍼사드 패턴들을 통해서만 통신하도록 함으로써 해당 하위시스템 간의 결합도를 줄일 수 있음

다른 패턴과의 관계

  • 퍼사드는 기존 객체들을 위한 새 인터페이스를 정의하는 반면 어댑터는 기존의 인터페이스를 사용할 수 있게 만들려고 노력한다.
    • 또 어댑터는 일반적으로 하나의 객체만 래핑하는 반면 퍼사드는 많은 객체의 하위시스템과 함께 작동한다.
  • 추상 팩토리는 하위시스템 객체들이 클라이언트 코드에서 생성되는 방식만 숨기고 싶을 때 퍼사드 대신 사용할 수 있다.
  • 플라이웨이트는 작은 객체들을 많이 만드는 방법을 보여 주는 반면 퍼사드 패턴은 전체 하위 시스템을 나타내는 단일 객체를 만드는 방법을 보여 준다.
  • 중재자와 퍼사드 패턴은 비슷한 역할을 한다. 둘 다 밀접하게 결합된 많은 클래스 간의 협업을 구성하려고 한다.
    • 퍼사드 패턴은 객체들의 하위 시스템에 대한 단순화된 인터페이스를 정의하지만 새로운 기능을 도입하지는 않는다. 하위 시스템 자체는 퍼사드를 인식하지 못하며, 하위 시스템 내의 객체들은 서로 직접 통신할 수 있다.
    • 중재자는 시스템 컴포넌트 간의 통신을 중앙 집중화한다. 컴포넌트들은 중재자 객체에 대해서만 알며 서로 직접 통신하지 않는다.
  • 대부분의 경우 하나의 퍼사드 객체만 있어도 충분하므로 퍼사드 패턴의 클래스는 종종 싱글턴으로 변환될 수 있다.
  • 퍼사드 패턴은 복잡한 객체 또는 시스템을 보호하고 자체적으로 초기화한다는 점에서 프록시와 유사하다. 퍼사드 패턴과 달리 프록시는 자신의 서비스 객체와 같은 인터페이스를 가지므로 이들은 서로 상호 교환이 가능하다.

퍼사드를 이용해 구현한 출근 프로세스

  • 퍼사드
public class GoOffice {

    public void goToWork() {
        Wash wash = new Wash();
        Breakfast breakfast = new Breakfast();
        Move move = new Move();

        wash.brushTeeth();
        wash.shower();
        breakfast.eat();
        breakfast.water();
        move.bus();
    }
}
  • 하위 시스템들
public class Wash {

    public void brushTeeth() {
        System.out.println("Brush my teeth");
    }

    public void shower() {
        System.out.println("Take a shower");
    }
}

public class Breakfast {

    public void eat() {
        System.out.println("Have breakfast");
    }

    public void water() {
        System.out.println("Drink water");
    }
}

public class Move {

    public void bus() {
        System.out.println("Take the bus");
    }
}
  • 클라이언트
public class Client {

    public static void main(String[] args) {
        GoOffice goOffice = new GoOffice();
        goOffice.goToWork();
    }
}
profile
학습한 내용을 빠르게 다시 찾기 위한 저장소

0개의 댓글