끝나지 않는 프로그래밍 일기

퍼사드 패턴(Facade pattern)복잡한 내부 시스템 로직을 감추고 클라이언트가 쉽게 시스템에 접근할 수 있는 인터페이스를 제공한다. 퍼사드의 예를 들어보자면, 가장 손쉽게 볼 수 있는 것으로 우리 눈앞에 보이는 컴퓨터를 예를 들 수 있다. 사용자는 그저 컴퓨터를 시작하기 위해 전원 버튼을 누를 뿐, 부팅 과정 중 프로세서나 메모리, 주변 장치 등의 검사와 초기화 등과 같은 하드웨어와 관련된 작업들을 알아야 할 필요는 없다.

 

퍼사드 패턴의 UML 클래스 다이어그램

  • 퍼사드(Facade): 외부에서 보기에 깔끔하도록, 복잡한 서브 시스템을 감싸는 역할을 한다. 어떤 클래스가 어떤 요청을 처리해야 하는지 알고 있으며, 클라이언트의 요청을 해당 서브 시스템 객체에 전달한다.
  • 시스템(System): 전체 시스템을 하나의 복잡한 복합체로 만드는 여러 서브 시스템의 집합이다. 퍼사드 객체가 지시한 일을 담당하지만, 이곳의 서브 시스템들은 퍼사드가 있는지도 모르며 참조하지도 않는다.
  • 클라이언트(Client): 퍼사드를 통해서 서브 시스템과 통신한다. 복잡한 시스템 구조에 대해 전혀 알 필요가 없다.

 

장점

  • 클라이언트와 서브 시스템의 연결을 느슨하게 만든다.
  • 더 단순한 인터페이스로 복잡한 서브 시스템을 감싼다.
  • 퍼사드 내부에서는 사용하지만, 클라이언트 코드와는 관련이 없는 외부 라이브러리에 대한 의존성을 낮춘다.

 

주의사항

  • 복잡한 서브 시스템을 과도하게 단순화 시키려고 한다면 퍼사드 객체를 통해 클라이언트가 할 수 있는 것이 제한되며, 그렇다고 좀처럼 단순화를 하지 않는다면 퍼사드 패턴의 본래 목적이 희미해진다. 따라서, 단순화와 제한 사이의 적절한 균형을 찾는 것이 좋다.

 

예제 코드

class CPU:
    def process_data(self): pass

class Memory:
    def load(self): pass

class HardDrive:
    def read_data(self): pass

# 퍼사드
class Computer:
    def __init__(self):
        self.cpu = CPU()
        self.memory = Memory()
        self.hard_drive = HardDrive()

    def run(self):
        self.cpu.process_data()
        self.memory.load()
        self.hard_drive.read_data()


computer = Computer()
computer.run()

 

정리

퍼사드 디자인 패턴은 클라이언트에게 간소화된 인터페이스를 제공한다. 그뿐 아니라, 클라이언트 객체가 다뤄야 하는 서브 시스템의 객체 수를 줄여준다. 서브 시스템에 대한 복잡성을 줄여 클라이언트의 일을 덜어주기도 한다. 퍼사드는 서브 시스템을 캡슐화하지 않으며, 클라이언트는 퍼사드를 통하지 않고 언제든 자유롭게 서브 시스템에 접근할 수 있다. 즉, 퍼사드는 클라이언트에게 사용을 강제하지 않는다는 것이다.

'메모 > Design pattern' 카테고리의 다른 글

메모. Iterator pattern  (0) 2019.11.22
메모. Proxy pattern  (0) 2019.11.18
메모. Facade pattern  (0) 2019.11.17
메모. Factory method pattern  (0) 2019.05.19
메모. Builder pattern  (0) 2019.05.18
메모. Concrete class  (1) 2019.05.13