정의
- 상속 또는 interface를 이용하여 Type을 맞춰 객체의 추가적인 요건을 동적으로 추가한다.
- 서브클래스(decorator class)를 만드는 것을 통해서 기능을 유연하게 확장할 수 있는 방법을 제시한다.
- 중요한점은 Decorator는 상속을 통해서 행동을 물려받는 것이 목적이 아니라는 것이다.
구성
- 각 구성요소는 직접 쓰일 수도 있고 decorator로 감싸져서 쓰일 수 있다.
- ConcreteComponent에 새로운 행동을 동적으로 추가하게 된다.
- 각 decorator 안에는 Component 객체가 들어있다.
- Decorator는 자신이 decorate할 구성요소와 같은 interface나 abstract class를 implement 한다.
- Decorator는 component의 상태를 확장할 수 있다.
- ConcreteDecorator에는 그 Object가 decorate하고 있는 것을 위한 interface 변수가 있다.
- decorator에서 새로운 method를 추가할 수 있다.
OCP (Open-Closed Principle) : class는 확장에 대해서는 open 해야 하지만 코드 수정에 대해서는 close 해야 한다. 즉 기존 코드는 건드리지 않은 채로 확장을 통해서 새로운 행동을 추가할 수 있도록 코드의 수정을 허용한다는 것으로 기능 추가에 유연하기에 튼튼한 디자인을 할 수 있다.
장점
- 기존 코드를 수정하지 않고도 행동을 확장하는 방법이 된다.
- Composition과 delegate를 통해서 실행 중에 새로운 행동을 추가할 수 있다.
- 상속대신 decorator pattern을 통해서 행동을 확장할 수 있다.
- OCP 에 충실하면서 유연한 디자인을 만들어 낼 수 있다.
단점
- 잡다한 클래스들이 많아 질 수 있다.
- 객체가 다른 객체들로 쌓여 있을 수 있기 때문에 파악하기 힘들 수 있다.
- 디자인 유연성 면에서는 좋지 않다.
구현 (Coffee 제조)