Facade 패턴

2023. 10. 13. 02:22카테고리 없음

개요

파사드는 라이브러리, 프레임워크 또는 기타 복잡한 클래스 집합에 단순화된 인터페이스를 제공하는 디자인 패턴이다.

해결하려는 문제

정교한 라이브러리나 프레임워크의 다양한 객체들을 다룰 때 모든 객체를 초기화하고, 종속성을 추적하고, 메서드를 올바른 순서로 실행하는 등의 작업을 수행해야 한다.

결과적으로 클래스의 비즈니스 로직이 써드 파티 라이브러리의 구현 세부 사항과 긴밀하게 결합되어 유지 관리가 어려워지게 된다.

해결법

파사드는 복잡한 서브시스템에 간단한 인터페이스를 제공하는 클래스다. 파사드는 서브시스템을 직접 사용하는 것보다 제한된 기능을 제공할 수 있다. 하지만 클라이언트가 실제로 중요하게 생각하는 기능만 포함한다.

파사드는 수십 개의 기능이 포함된 정교한 라이브러리와 앱을 통합해야 하지만 일부 기능만 필요할 때 유용하다.

예를 들어, 동영상을 소셜 미디어에 업로드하는 앱은 전문적인 동영상 변환 라이브러리를 사용할 수 있다. 그러나 실제로 필요한 것은 encode 단일 메서드를 가진 클래스 뿐이다. 이러한 클래스를 생성하고 비디오 변환 라이브러리와 연결하면 파사드가 완성된다.

적용하기

  • 복잡한 하위 시스템에 대한 제한적이지만 간단한 인터페이스가 필요한 경우 파사드 패턴을 사용한다.
  • 하위 시스템을 레이어로 구성하려는 경우 파사드를 사용한다.
    • 파사드를 생성하여 하위 시스템의 각 레벨에 대한 진입점을 정의할 수 있다. 여러 하위 시스템이 파사드를 통해서만 통신하도록 하여 여러 하위 시스템 간의 결합을 줄일 수 있다.

예제 코드

class Facade {
    protected subsystem1: Subsystem1;

    protected subsystem2: Subsystem2;

    constructor(subsystem1?: Subsystem1, subsystem2?: Subsystem2) {
        this.subsystem1 = subsystem1 || new Subsystem1();
        this.subsystem2 = subsystem2 || new Subsystem2();
    }

    public operation(): string {
        let result = 'Facade initializes subsystems:\\n';
        result += this.subsystem1.operation1();
        result += this.subsystem2.operation1();
        result += 'Facade orders subsystems to perform the action:\\n';
        result += this.subsystem1.operationN();
        result += this.subsystem2.operationZ();

        return result;
    }
}

class Subsystem1 {
    public operation1(): string {
        return 'Subsystem1: Ready!\\n';
    }

    public operationN(): string {
        return 'Subsystem1: Go!\\n';
    }
}

class Subsystem2 {
    public operation1(): string {
        return 'Subsystem2: Get ready!\\n';
    }

    public operationZ(): string {
        return 'Subsystem2: Fire!';
    }
}

function clientCode(facade: Facade) {
    // ...

    console.log(facade.operation());

    // ...
}

const subsystem1 = new Subsystem1();
const subsystem2 = new Subsystem2();
const facade = new Facade(subsystem1, subsystem2);
clientCode(facade);

 

출처

https://refactoring.guru/design-patterns/facade