[1] 개념 및 사용하는 경우.
{1} 개념
- 객체에 동적으로 새로운 책임을 추가할 수 있게 하는 패턴.
- 데코레이터는 서브클래스를 만드는 것을 통해서 기능을 유연하게 확장할 수 있는 방법을 제공한다.이를 이용하여 OCP를 충족하는 유연한 구조를 만들수 있다.
{2} 사용하는 경우.
- 객체의 타입과 호출 가능한 메소드를 그대로 유지하면서 객체에 새로운 책임을 추가할 때 사용한다.
- 탈부착 가능한 책임을 정의할 때 사용한다.
- 상속을 통해 서브클래스를 계속 만드는 방법이 비효율적일 때 사용한다.
- 특히 조합되는 경우의 수가 많으면 서브클래스 수가 폭발적으로 늘어날 수 있다.
[2] 본론.
{1} 이론.
Component
- 기본 기능을 뜻하는 ConcreteComponent와 추가 기능을 뜻하는 Decorator의 공통 기능을 정의즉, 클라이언트는 Component를 통해 실제 객체를 사용함
ConcreteComponent
Decorator
- 많은 수가 존재하는 구체적인 Decorator의 공통 기능을 제공
ConcreteDecoratorA, ConcreteDecoratorB
- Decorator의 하위 클래스로 기본 기능에 추가되는 개별적인 기능을 뜻함
{2} 예시.
코드 예시 2개.
(1) 커피 주문.
(2) 자바 I/O
- InputStream : 추상 구성요소
- FileInuptStream : 구상 구성요소
- FilterInputStream : 추상 데코레이터
- PushbackInputStream, Buffered InputStream : 구상 데코레이터 역할
[3] 주의사항
- 특정 형식에 의존하는 코드에 사용하기 어려움ex) 특정 구상 구성요소인지 확인한 다음 어떤 작업을 처리하는 경우.
- 자잘한 클래스가 너무 많이 추가될 수 있음.(ex) 자바 I/O)
- 데코레이터를 도입하면 구성요소를 초기화하는데 필요한 코드가 복잡해질수 있는 단점이 있음.이때 빌더 패턴(Builder Pattern), factory-pattern을 같이 사용하기도 함.
[4] 실습
[5] 참고자료
HeadFirst Design Pattern 3 데코레이터 패턴
https://johngrib.github.io/wiki/decorator-pattern/
[Design Pattern] 데코레이터 패턴이란 - Heee's Development Blog
[디자인패턴] 데코레이터 패턴 (Decorator Pattern)