퍼사드 패턴은 객체 지향 디자인 패턴 중 하나로, 서브시스템의 복잡성을 감소시키기 위해 사용됩니다. 이 패턴은 간단한 인터페이스를 제공하여 서브시스템의 복잡성을 숨기고, 클라이언트와 서브시스템 간의 상호작용을 간소화합니다.
1. 설명
간단한 예를 들어보겠습니다. 가정용 전기 제품을 다루는 프로그램을 개발한다고 가정해봅시다. 이 프로그램에는 다양한 전기 제품이 있고, 각 제품에 대한 제어를 위해 해당 제품의 클래스를 만들어야 합니다. 예를 들어, 전등 클래스, 토스터 클래스, 에어컨 클래스 등이 있을 수 있습니다. 이러한 클래스를 모두 다루는 것은 복잡하고 번거로울 수 있습니다. 이런 경우, 퍼사드 패턴을 사용하여 해당 클래스들을 간단한 인터페이스로 숨길 수 있습니다.
2. 예제 코드
다음은 파이썬 코드 예제입니다.
# 서브시스템 클래스들
class Light:
def turn_on(self):
print("전등을 켭니다.")
def turn_off(self):
print("전등을 끕니다.")
class AirConditioner:
def turn_on(self):
print("에어컨을 켭니다.")
def turn_off(self):
print("에어컨을 끕니다.")
class Television:
def turn_on(self):
print("TV를 켭니다.")
def turn_off(self):
print("TV를 끕니다.")
# 퍼사드 클래스
class HomeFacade:
def __init__(self):
self.light = Light()
self.air_conditioner = AirConditioner()
self.television = Television()
def go_to_sleep(self):
self.light.turn_off()
self.air_conditioner.turn_off()
self.television.turn_off()
def wake_up(self):
self.light.turn_on()
self.air_conditioner.turn_on()
self.television.turn_on()
# 클라이언트 코드
facade = HomeFacade()
facade.wake_up()
facade.go_to_sleep()
위 코드에서 HomeFacade 클래스는 퍼사드 역할을 합니다. HomeFacade 클래스의 인스턴스를 만들어서 wake_up() 메서드와 go_to_sleep() 메서드를 호출하면, 각각의 메서드에서는 Light, AirConditioner, Television 클래스의 객체를 생성하고, 해당 객체의 turn_on() 또는 turn_off() 메서드를 호출하여 각 전기 제품을 제어합니다.
클라이언트 코드에서는 HomeFacade 클래스의 인스턴스를 만들어서 wake_up() 메서드와 go_to_sleep() 메서드를 호출하는 것으로 전기 제품을 제어하는 복잡한 로직을 숨길 수 있습니다. 클라이언트는 단순히 HomeFacade 클래스의 인스턴스를 만들어서 메서드를 호출하면 됩니다.
3. 장점
- 간단한 인터페이스를 제공하여 복잡한 시스템을 숨길 수 있습니다.
- 서브시스템 간의 상호작용을 간소화하여 유지보수성을 향상시킵니다.
- 클라이언트 코드의 복잡성을 줄일 수 있습니다.
4. 단점
- 시스템을 단순화하는 대신, 시스템의 일부 기능을 제한할 수 있습니다.
- 서브시스템 클래스들의 변경이 일어날 경우, 퍼사드 클래스도 수정해야 할 수 있습니다.
- 추가적인 퍼사드 클래스가 필요한 경우, 시스템의 구조가 복잡해질 수 있습니다.
따라서, 퍼사드 패턴은 시스템을 단순화하고 유지보수성을 향상시키는 장점이 있지만, 제한적인 기능과 클래스 변경에 대한 유연성 부족 등의 단점이 있습니다. 따라서 패턴을 적용할 때는 장단점을 고려하여 적절하게 사용해야 합니다.
'설계' 카테고리의 다른 글
[디자인 패턴] 프록시 패턴 (Proxy Pattern) - python 예제 코드 (0) | 2023.03.08 |
---|---|
[디자인 패턴] 플라이웨이트 패턴 (Flyweight Pattern) - python 예제 코드 (0) | 2023.03.08 |
[디자인 패턴] 데코레이터 패턴 (Decorator Pattern) - python 예제 코드 (0) | 2023.03.07 |
[디자인 패턴] 컴포지트 패턴 (Composite Pattern) - python 예제 코드 (0) | 2023.03.07 |
[디자인 패턴] 브릿지 패턴 (Bridge Pattern) - python 예제 코드 (0) | 2023.03.07 |