데코레이터 패턴으로 객체에 추가 요소를 실행 중에 동적으로 더할 수 있다. 데코레이터를 사용하면 서브클래스를 만들 때보다 훨씬 유연하게 기능을 확장할 수 있다.
감싸고 있는 객체에 행동을 추가하거나 위임하는 용도로 만들어진다. 예를 들어 문자열을 다양한 방법으로 출력하고 싶을 때 사용할 수 있다. 문장 앞에 줄번호를 붙이거나, 소문자로 바꾸어 출력하거나, 박스로 감싸서 출력할 수 있다. 이때 문자열은 감싸지는 객체이고 추가하는 행동은 데코레이터의 책임이다.
어떤 객체와 상호작용하는 다른 객체들은 그 객체의 장식의 유무와 상관없이 그 객체에게 메시지를 보낸다. 데코레이터에게도 원래 객체와 동일한 메시지 요청이 오므로, 이 메시지를 수신하려면 데코레이터와 감싸지는 객체는 같은 타입이어야 한다.
감싸지는 객체의 책임은 ConcreateComponent에, 장식의 책임은 Decorator에 할당한다. 이 둘은 같은 타입이어야 하므로 Component를 구현하거나 상속한다. 장식 기능의 구체적인 구현은 ConcreteDecorator에서 담당한다.
데코레이터 패턴은 OCP 규칙을 효과적으로 지킬 수 있는 패턴이다. OCP는 기존 코드를 변경하지 않고 확장으로 새로운 행동을 추가하는 기법이다. 요구사항이 변경이 발생하는 상황에서 유연하게 코드를 관리할 수 있다.