Python/Design Patterns

퍼사드(Facade)

코닝구 2020. 9. 27. 19:07

디자인 패턴 중에서 퍼사드(Facade)에 대해서 알아보자. 퍼사드 패턴은 GoF가 제시한 구조 패턴(Structural Pattern)중의 하나로 클라이언트에게 시스템의 복잡성(complexity)을 숨기고, 사용하기 편하도록 간단하고 구체적인 고수준의 인터페이스를 제공하는 패턴이다.

https://refactoring.guru

복잡한 라이브러리 또는 프레임워크를 생각해 보자. 원하는 동작을 위해선 객체를 초기화하고 종속성을 추적하며 메소드를 실행해야 한다. 하지만 클라이언트측에선 이를 모두 이해하고, 유지하기란 쉽지 않다.

퍼사드는 시스템이 아무리 복잡하더라도 간단하고 쉽게 클라이언트가 접근 할 수 있는 인터페이스를 제공하는 것이다.


기본개념

퍼사드 패턴에는 일반적으로 Facade 클래스, System 클래스, Client 클래스가 있다.

https://refactoring.guru

Facade: 해당 클래스는 System 클래스를 사용하여 Client 클래스에서 사용할 인터페이스를 구현한다.

System: 해당 클래스는 특정 목적을 위한 여러개의 클래스가 있다.

Client: 해당 클래스는 Facade 클래스를 통해 System 클래스에 접근 할 수 있다.


구현

간단한 예제를 통해 퍼사드 패턴을 구현해 보자.

class _SubSystem1:
    def operation(self):
        pass


class _SubSystem2:
    def operation(self):
        pass

    def execute(self):
        pass


class Facade:
    def __init__(self):
        self.s1 = _SubSystem1()
        self.s2 = _SubSystem2()

    def execute(self):
        self.s1.operation()
        self.s2.operation()
        self.s2.execute()


if __name__ == '__main__':
    f = Facade()
    f.execute()

간단한 동작을 하는 System 클래스를 2개 구현하였다. 그리고 Client 에서는 어떤 이유에서든 System 클래스를 직접 접근할 수 없어야 함으로 Facade 라는 Facade 클래스를 구현하였다. 즉, Client는 어떤 목적을 위해 System의 동작을 이해할 필요 없이 Facade의 execute만 실행하면 된다.

퍼사드는 System 클래스의 메소드들을 조합하여 Client에서 필요한 API를 제공함으로 Client는 최소 호출을 할 수 있고, 느슨한 결합(Loose coupling)으로 System 클래스의 동작 변경에 부담이 없다.

'Python > Design Patterns' 카테고리의 다른 글

템플릿 메소드(Template Method)  (0) 2020.09.30
싱글턴(Singleton)  (0) 2020.09.29
보그(Borg)  (0) 2020.09.27
데코레이터(Decorator)  (0) 2020.09.22