나는 이렇게 본다/파이썬 디자인 패턴

퍼사드 패턴

daco2020 2022. 5. 31. 19:18
반응형

퍼사드 디자인 패턴 개요

  • 퍼사드는 건물의 정면, 돋보이는 쪽을 의미. 즉, 건물의 외관만 신경 쓰지 내부 구조는 신경 쓰지 않는다.
  • 복잡한 내부 로직을 감추고 클라이언트가 쉽게 접근할 수 있는 인터페이스 제공
  • 구성요소 : 퍼사드, 시스템, 클라이언트
  • 목적
    • 서브시스템의 인터페이스를 통합시킨 단일 인터페이스를 제공해 클라이언트가 쉽게 서브시스템에 접근할 수 있게 한다.
    • 단일 인터페이스 객체로 복잡한 서브시스템을 대체한다. 서브시스템을 캡슐화하는 것이 아니라 모든 서브시스템들을 결합한다.
    • 클라이언트와 내부 구현을 분리한다.

 

퍼사드

  • 어떤 서브시스템이 요청에 알맞는지 알고 있다.
  • 컴포지션을 통해 클라이언트의 요청을 서브시스템 객체에 전달
  • 클라이언트는 서브시스템이 아닌 퍼사드에만 요청
  • 단, 퍼사드는 서브시스템을 캡슐화하지 않는다. 때문에 클라이언트는 퍼사드를 통하지 않고도 서브시스템에 접근할 수 있다.

 

 

시스템

  • 서브시스템의 기능을 구현하는 클래스
  • 시스템은 각기 다른 역할을 하는 클래스의 집합
  • 퍼사드 객체가 지시한 일을 담당하지만 퍼사드의 존재도 모르며 참조하지도 않는다.

 

 

클라이언트

  • 퍼사드를 인스턴스화하는 클래스
  • 작업을 수행하도록 요청

 

 

퍼사드 패턴 구현

  • 구현 예시) 결혼식 준비 >>> 클라이언트: 나, 퍼사드: 웨딩플래너, 시스템: 각 담당 업체
## 퍼사드(인터페이스)
class EventManager(object):
    def __init__(self):
        print("웨딩플래너 : 제가 당신을 도와드릴게요.\\n\\n")
    
    def arrange(self):
        self.hotelier = Hotelier()
        self.hotelier.book_hotel()

        self.florist = Florist()
        self.florist.set_flower_requirements()

        self.caterer = Caterer()
        self.caterer.set_cuisine()

        self.musician = Musician()
        self.musician.set_music_type()

## 서브시스템(구현)
# 호텔리어 - 호텔 담당
class Hotelier(object):
    def __init__(self):
        print("호텔리어 : 안녕하세요.\\n")
    
    def book_hotel(self):
        print("호텔리어 : 예약을 도와드리겠습니다.\\n\\n")

# 플로리스트 - 꽃 담당
class Florist(object):
    def __init__(self):
        print("플로리스트 : 안녕하세요.\\n")

    def set_flower_requirements(self):
        print("플로리스트 : 장미와 백합을 준비하겠습니다.\\n\\n")

# 요리조달자 - 요리 담당
class Caterer(object):
    def __init__(self):
        print("요리사 : 안녕하세요.\\n")

    def set_cuisine(self):
        print("요리사 : 뷔페를 준비하겠습니다.\\n\\n")

# 음악가 - 연주 담당
class Musician(object):
    def __init__(self):
        print("뮤지션 : 안녕하세요.\\n")

    def set_music_type(self):
        print("뮤지션 : 재즈를 준비하겠습니다.\\n\\n")

## 클라이언트
class You(object):
    def __init__(self):
        print("나 : 결혼식 준비를 해야해!\\n")
    def ask_event_manager(self):
        print("나 : 웨딩플래너에게 연락해보자!\\n\\n")
        em = EventManager()
        em.arrange()
    def __del__(self):
        print("나 : 다들 고마워요!\\n")

you = You()
you.ask_event_manager()
# 출력 결과

'''
나 : 결혼식 준비를 해야해!
나 : 웨딩플래너에게 연락해보자!

웨딩플래너 : 제가 당신을 도와드릴게요.

호텔리어 : 안녕하세요.
호텔리어 : 예약을 도와드리겠습니다.

플로리스트 : 안녕하세요.
플로리스트 : 장미와 백합을 준비하겠습니다.

요리사 : 안녕하세요.
요리사 : 뷔페를 준비하겠습니다.

뮤지션 : 안녕하세요.
뮤지션 : 재즈를 준비하겠습니다.

나 : 다들 고마워요!
'''

 

 

최소 지식 원칙

  • 퍼사드 패턴은 최소 지식 원칙을 기반으로 한다.
  • 최소 지식 원칙은 상호작용하는 객체를 아주 가까운 몇 개의 객체로 최소화한다.
  • 생성하는 모든 객체가 몇 개의 클래스와 연관되며 어떤식으로 상호작용하는지 알아야 한다.
  • 원칙에 따라 지나치게 얽히는 클래스는 지양한다.
  • 클래스간 의존도가 높아지지 않도록 회귀적인 구조는 피한다.
반응형