복잡한 서브시스템을 단순화하기 위해 제공되는 단순한 인터페이스를 설계하는 구조적 디자인 패턴입니다. 여러 클래스와 그들의 메서드로 구성된 복잡한 시스템을 사용할 때, 클라이언트가 직접 복잡성을 다루지 않고 단순한 인터페이스만으로 시스템을 쉽게 사용할 수 있도록 도와줍니다.
복잡한 서브시스템의 사용성을 개선하기 위해 사용됩니다.
클라이언트 코드가 서브시스템의 세부사항에 종속되지 않도록 보호합니다.
서브시스템 내부 구현이 변경되더라도 클라이언트 코드에 영향을 최소화합니다.
# 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()