데코레이터 패턴이란?
객체에 추가적인 요건을 동적으로 첨가하는것,
서브클래스를 만드는 것을 통해서 기능을 유연하게 확장하는 것을 제시함
데코레이터의 다이어그램
- 구성 요소는 데코레이터로 감싸져서 쓰일수도 있고, 직접 쓸수도 있습니다.
- Decorator는 자신이 장식할 구성요소와 같은 인터페이스 또는 추상 클래스를 구현
- 데코레이터 클래스에서는 해당 객체가 장식하고 있는 인스턴스 변수가 있습니다 (위에 다이어그램에선 WrapperObj)
- 데코레이터는 컴포넌트의 상태를 확장할 수 있음
- 데코레이터에서 새로움 메소드를 추가 할 수 있음, 그러나 새로운 메소드를 추가하는 대신 컴포넌트에 원래 있던 메소드를 호출하기전, 또는 후에 별도의 작업을 처리하는 방식으로 새로운 기능을 추가함
-----------------------------------------------------------------------------------------------------------------
데코레이터가 필요한 경우?
프랜차이즈 커피점이 있습니다.
해당 커피점에 주문시스템을 갖추려고 할때 어떻게 해야할까요?
기존에 만들어진 주문시스템은
*Beverage는 음료를 나타내는 추상클래스로, 커피점에서 판매되는 모든 음료는 이 클래스의 서브 클래스가 되어짐
cost() 메소드는 추상 메소드로 서브클래스에서 그 메소드를 구현하여 새로 정의 해야함
이제 에스프레소 클래스에 물을 추가하면 아메리카노가되고, 우유를 추가하면 라떼가되고, 초코시럽을 넣으면 모카도 되고 휘핑도 올릴 수 있습니다. 또한 각각 추가시에 따라 가격은 올라갑니다.
위에 말한것처럼, 메뉴가 추가 될때마다 해당 메뉴에 대한 클래스들이 추가가 되었습니다.
이후 계속 메뉴가 추가되고 클래스가 많아진다라면 해당 클래스의 관리가 어려워집니다.!
어떻게 해야 좋은 구조가 나올 수 있을까요?
이때 사용하는것이 데코레이터 패턴입니다.
특정 음료에서 시작하여, 첨가물로 해당 음료에 장식을 하는 것 입니다.
만약 손님이 디카페인 모카에 휘핑크림 추가하여을 주문을 한다고합니다
1. 디카페인 음료 객체를 가져온다
2. 모카를 넣는다. (장식한다)
3. 휘핑크림을 올려준다 (장식한다)
4. 가격을 계산한다.
이렇게 객체를 감싸는 데코레이터 형태가 나타나게 되어집니다.
그럼 계산은 어떻게 하냐 (일단 가격을 가정합시다 : decaf 가격 1000원, 모카 500원 휘핑 500원으로 측정)
가장 밖에 있는 휘핑의 cost() 메소드를 호출 합니다
그럼 휘핑의 cost()는 모카의 cost()를 부르고, 모카는 Decaf의 cost()를 부릅니다.
그럼 다시 Decaf의 cost가격(1000원)을 리턴하고 ,
그 이후 모카의 cost가격인 500원에 리턴받은 1000원을 더하여 1500원을 리턴하고
그 이후 휘핑의 cost가격인 500원에 리턴받은 1500원을 더하여 2000원을 리턴합니다
그래서 최종 금액이 2000원으로 계산이 되어지는 것입니다!
위에 내용을 기준하여 데코레이터 형식의 다이어그램을 그려보면
이후 샷 추가기 있다라면 ExtraDecorator 하위로 Shot 클래스를 만드는 형태
---------------------------------------------------------------------------------------------------------------
데코레이터를 사용하게 되면 객체가 많아질수록 관리하는 것이 복잡해짐,
가물며 데코레이터 도입하면 구성요소를 초기화하는데 필요한 코드가 훨씬 복잡해질수 있음
---> 팩토리와, 빌더패턴이 해당 부분에 대해서 보완할 수 있음!
핵심정리
- 구성과 위임을 통해 실행중에 새로운 행동을 추가할 수 있음
- 상속 대신 데코레이터 패턴을 통하여 행동을 확장 할 수 있음
- 데코레이터 패턴에서는 구상 구성요소를 감싸주는 데코레이터들을 사용함
- 데코레이터 클래스의 형식은 그 클래스가 감싸고 있는 클래스의 형식을 반영함 (상속 혹은 인터페이스 구현으로 같은형식 가짐)
- 데코레이터에서는 자기가 감싸고 있는 구성요소의 메소드를 호출한 결과에 새로운 기능을 더함으로써 행동을 확장함
- 구성요소를 감싸는 데코레이터의 개수에는 제한 없음
'IT > Etc.' 카테고리의 다른 글
[개념] 페이로드(Payload)란? (0) | 2022.05.18 |
---|---|
[디자인패턴 ] 싱글턴 패턴 (0) | 2021.01.22 |
[디자인 패턴] 옵저버 패턴 Observer Pattern (0) | 2021.01.15 |
[디자인패턴] 디자인 패턴이 중요할까? (0) | 2021.01.15 |
디자인패턴 (0) | 2021.01.15 |