객체에 추가 책임(기능)을 동적으로 추가하고, 기능 확장을 위한 유연한 대안 제공
Motivation
객체의 기능의 동적(at runtime) 확장성이 필요한 경우가 있습니다.
Graphical Window의 예를 생각해봅시다! Window에 Frame을 더하고 싶다?? 그러면 Window를 상속한 FramedWindow 클래스를 만들어야합니다. 근데 런타임에 이미 생성된 Window 객체에 Frame을 더할려면 어떻게 해야 할까요??
Intent
- 데코레이터 패턴의 Intent는 객체에 추가적인 책임을 “동적으로” 주는 것입니다.
Implementation

- component - 동적으로 객체에 책임을 추가하는 인터페이스
- ConcreteComponent - 추가적인 책임이 적용될 수 있는 객체
- Decorator - 추가 기능에 대한 인터페이스
- Concrete Decorators - 추가기능 - 메소드 (Functionality)를 추가할 수도 있고 상태 (State, Field)를 추가 할 수도 있다.
Description
데코레이터 패턴은 동적인 책임의 추가 뿐만아니라 책임의 제거에도 활용될 수 있습니다. Subclassing을 활용한 책임의 추가와 제거는 너무 많은 Subclass를 만들어 낼 수 있습니다.
Applicablity & Examples

renderWindow( ) 기능만을 가진 SimpleWindow에 Scrollable이라는 기능을 추가하는 예제입니다.
/* 코드 생략! */
public class GUIDriver { public static void main(String[] args) { // create a new window Window window = new SimpleWindow(); window.renderWindow(); // at some point later // maybe text size becomes larger than the window // thus the scrolling behavior must be added // decorate old window window = new ScrollableWindow(window); // now window object // has additional behavior / state window.renderWindow(); } }
Note!
-
DecoratedWindow
가privateWindowReference
를 Has-A하고 있다
- DecoratedWindow를 여러번, 여러 종류 적용 할 수 있다.
Examples
- GUI Frameworks
- Java IO Package
Related Patterns
- Adapter Pattern
- Composite Pattern