- Today
- Total
작심삼일
5주차-1. Decorator Pattern 본문
디자인 패턴을 모르는 사람이 스터디를 하며 적은 것이라 틀린 부분이 있을 수 있습니다.
틀린 부분은 알려주시면 감사하겠습니다.
어떤 패턴인가
"객체에 동적으로 새로운 책임을 추가할 수 있게 합니다. 기능을 추가하려면, 서브클래스를 생성하는 것보다 융통성 있는 방법을 제공합니다." 라고 책에 적혀있지만, 나는 이해하기 어려웠다.
스터디를 마친 후에야 decorator pattern이 이해됐는데, 한마디로 정리하자면, 기능을 계속 추가하는 패턴이다.
기본에 이것저것 가져다 붙일 때나, 규모를 분할하고 계층화할 때 유용하다.
하지만 데코레이터가 너무 많아지면 지저분해지고(여느 코드가 그렇 듯), 어디서 책임이 추가된 것인이 확인하기 어려워진다.
어떻게 쓰는가
Component, ConcreteComponent, Decorator, ConcreteDecorator 등을 만든다고 하지만, 이런 식으로 따로따로 보는 것보다 decorator를 사용한 코드를 여러 개 보는 것이 이해가 빠를 것 같다.
def trace(func):
def wrapper():
print(func.__name__, '함수 시작')
func()
print(func.__name__, '함수 끝')
return wrapper
@trace
def hello():
print('hello')
위와 같이 함수를 만들었을 때, hello() 함수를 실행시키면 아래와 같이 나온다.
hello 함수 시작
hello
hello 함수 끝
어디서 활용되는가
이는 책의 내용 (p. 243)을 그대로 가져왔다.
1. 동적으로 또한 투명하게, 다시 말해 다른 객체에 영향을 주지 않고 개개의 객체에 새로운 책임을 추가하기 위해 사용합니다.
기능을 계속 추가한다.
2. 제거될 수 있는 책임에 대해 사용합니다.
기능을 계속 추가하는 것이라서 그 기능을 제거하기 용이하다.
3. 실제 상속으로 서브클래스를 계속 만드는 방법이 실질적이지 못할 때 사용합니다.
상속을 여러 번 받는다면 그 함수가 너무 쓸데없이 커질 가능성이 높다.
My Opinion
Python에서 decorator가 많이 사용되지만, 개인적으로 나는 한 번도 사용해본 적이 없었고, 그렇기 때문에 그 효용을 잘 몰랐다.
이렇게 공부하고 여러 사람들의 예시 코드를 보니 되게 효율적이지만, 막상 사용하려고하면 생각이 안날 것 같다.
필요할 때 쓸 수 있도록 항상 머릿속에 넣어두는게 중요할 것 같다.
'스터디 > 디자인 패턴' 카테고리의 다른 글
6주차-1. Adapter (0) | 2021.06.09 |
---|---|
5주차-2. State Pattern (0) | 2021.05.26 |
4주차-2. Template Method (0) | 2021.05.13 |
4주차-1. Prototype (0) | 2021.05.13 |
3주차-2. Singleton (0) | 2021.04.30 |