Decorator Pattern ( Structural Design Pattern )
데코레이터 패턴이란?
- 원하는 기능을 감싸는 데코레이터를 만들어 기능을 추가하는 패턴이다.
- 기능을 추가하는 데코레이터는 기능을 추가하는 인터페이스로 구현한다.
데코레이터 패턴의 구성요소
- Component : 기능이 추가되는 대상이 되는 인터페이스
- ConcreteComponent : 기능이 추가되는 대상이 되는 클래스
- Decorator : 기능을 추가할 때 사용하는 데코레이터 클래스
- ConcreteDecorator : 기능을 추가할 때 사용하는 데코레이터 클래스
- Client : 데코레이터 패턴을 사용하는 클래스
데코레이터 패턴의 구조
케이크 (Component)
생크림케이크 (ConcreteComponent)
치즈케이크 (ConcreteComponent)
토핑추가(Decorator)
딸기토핑 (ConcreteDecorator)
초코토핑 (ConcreteDecorator)
치즈케이크 -> 딸기토핑 -> 딸기치즈케이크
생크림케이크 -> 초코토핑 -> 초코생크림케이크
데코레이터 패턴 예시
# Component
# Component
class Cake:
def explain(self):
pass
# ConcreteComponent
class CreamCake(Cake):
def explain(self):
print("크림",end="")
# ConcreteComponent
class CheeseCake(Cake):
def explain(self):
print("치즈 ",end="")
# Decorator
class DecorateCake(Cake):
def __init__(self, cake : Cake):
self.cake = cake
def explain(self):
self.cake.explain()
# ConcreteDecorator
class StrawberryTopping(DecorateCake):
def __init__(self, cake : Cake):
super().__init__(cake)
def explain(self):
super().explain()
print("딸기",end="")
# ConcreteDecorator
class ChocolateTopping(DecorateCake):
def __init__(self, cake : Cake):
super().__init__(cake)
def explain(self):
super().explain()
print("초코",end="")
myCake = CreamCake()
myCake.explain(); print("케이크!")
newMyCake = StrawberryTopping(myCake)
newMyCake.explain(); print("케이크!")
specialCake = ChocolateTopping(newMyCake)
specialCake.explain(); print("케이크!")
덧붙임
- Decorator 는 Component 를 멤버로 가지고 있어야 한다.
- Decorator 는 Component 를 멤버로 가지고 있기 때문에, Decorator 를 사용하는 클래스는 Component 를 사용하는 것과 같다.
- API 가 투과적이다.
- Decorator 를 사용하는 클래스는 Component 를 사용하는 것과 같기 때문에, Decorator 를 사용하는 클래스는 Component 를 사용하는 것과 같다.
- API가 투과적이기 때문에 재귀적으로 Decorator 를 사용할 수 있다.
- 예시) 초코토핑 추가 , 초코토핑 추가 , 초코토핑 추가 ,초코토핑 추가
728x90
반응형
'Dev > DesignPattern' 카테고리의 다른 글
[Design Pattern]Flyweight Pattern (0) | 2023.04.26 |
---|---|
[Design Pattern]Bridge Pattern (0) | 2023.04.26 |
[Design Pattern]Facade Pattern (0) | 2023.04.26 |
[Design Pattern] Proxy Pattern (0) | 2023.04.26 |
[DesignPattern] Adapter Pattern (0) | 2023.04.26 |