디자인 패턴 - Fasade 패턴

code_able·2024년 11월 21일
0

Fasade 패턴이란

복잡한 서브시스템을 단순화하기 위해 제공되는 단순한 인터페이스를 설계하는 구조적 디자인 패턴입니다. 여러 클래스와 그들의 메서드로 구성된 복잡한 시스템을 사용할 때, 클라이언트가 직접 복잡성을 다루지 않고 단순한 인터페이스만으로 시스템을 쉽게 사용할 수 있도록 도와줍니다.

목적

복잡한 서브시스템의 사용성을 개선하기 위해 사용됩니다.
클라이언트 코드가 서브시스템의 세부사항에 종속되지 않도록 보호합니다.
서브시스템 내부 구현이 변경되더라도 클라이언트 코드에 영향을 최소화합니다.

구조

  • Subsystem (서브시스템): 복잡한 로직을 포함하는 클래스들의 집합입니다. 각 클래스는 고유한 기능을 가지고 있습니다.
  • Facade (파사드): 서브시스템의 복잡성을 숨기고, 클라이언트가 사용할 단순화된 인터페이스를 제공합니다.
  • Client (클라이언트): 파사드 객체를 사용해 서브시스템의 기능을 간접적으로 호출합니다.

장점

  • 서브시스템의 복잡성 숨기기: 클라이언트는 단순화된 인터페이스를 통해 복잡한 서브시스템을 쉽게 사용할 수 있습니다.
  • 유지보수성 증가: 서브시스템 내부 구현이 변경되더라도, 파사드 인터페이스만 유지되면 클라이언트 코드에는 영향을 미치지 않습니다.
  • 서브시스템 의존성 감소: 클라이언트가 서브시스템의 구체적인 클래스에 의존하지 않도록 분리합니다.

단점

  • 서브시스템의 모든 기능을 파사드에 노출하려면 복잡성이 증가할 수 있습니다.
  • 잘못 설계된 파사드는 추가 기능 추가 시 유연성이 부족할 수 있습니다.

파사드 패턴의 예제

# Subsystem: 홈 시어터 구성 요소
class BluRayPlayer:
    def on(self):
        print("BluRay Player is ON")

    def play(self, movie: str):
        print(f"Playing movie: {movie}")

    def stop(self):
        print("Stopping BluRay Player")

    def off(self):
        print("BluRay Player is OFF")


class Projector:
    def on(self):
        print("Projector is ON")

    def wide_screen_mode(self):
        print("Projector is set to wide screen mode")

    def off(self):
        print("Projector is OFF")


class SurroundSoundSystem:
    def on(self):
        print("Surround Sound System is ON")

    def set_volume(self, level: int):
        print(f"Setting volume to {level}")

    def off(self):
        print("Surround Sound System is OFF")


# Facade: 홈 시어터 파사드
class HomeTheaterFacade:
    def __init__(self, blu_ray: BluRayPlayer, projector: Projector, sound_system: SurroundSoundSystem):
        self.blu_ray = blu_ray
        self.projector = projector
        self.sound_system = sound_system

    def watch_movie(self, movie: str):
        print("\nStarting the movie experience...")
        self.blu_ray.on()
        self.blu_ray.play(movie)
        self.projector.on()
        self.projector.wide_screen_mode()
        self.sound_system.on()
        self.sound_system.set_volume(10)

    def end_movie(self):
        print("\nEnding the movie experience...")
        self.blu_ray.stop()
        self.blu_ray.off()
        self.projector.off()
        self.sound_system.off()


# Client: 클라이언트 코드
blu_ray = BluRayPlayer()
projector = Projector()
sound_system = SurroundSoundSystem()

# Facade 객체 생성
home_theater = HomeTheaterFacade(blu_ray, projector, sound_system)

# 영화 관람
home_theater.watch_movie("Inception")
# 영화 종료
home_theater.end_movie()
profile
할수 있다! code able

0개의 댓글