장식자(Decorator) 패턴

sonnie
lucky-sonnie
Published in
2 min readJan 16, 2021

가끔 전체 클래스에 새로운 기능을 추가할 필요는 없지만, 개별적인 객체에 새로운 책임을 추가할 필요가 있다. 이렇게 새로운 서비스의 추가가 필요할 때 이를 해결하는 일반적인 방법은 상속을 이용하는 것이다. 하지만 이렇게 하면 테두리의 선택이 정적이기 때문에 사용자는 구성요소를 언제 어떻게 테두리로 장식해야 할지 제어할 수 없다.

더 나은 방법은 지금 필요한 테두리를 추가하는 다른 객체에 해당 구성요소를 둘러싸는 것이다. 이렇게 무엇인가를 감싸는 객체를 장식자(Decorator)라고 한다. 장식자는 자신이 둘러싼 요소, 구성요소가 갖는 인터페이스를 자신도 동일하게 제공하므로, 장식자의 존재는 이를 사용하는 사용자에게 감춰진다. 즉, 장식자는 자신이 둘러싼 구성요소로 전달되는 요청을 중간에 가로채 해당 구성요소에 전달해 준다. 여기에는 투명성이 존재하기 때문에 장식자의 중첩이 가능하며, 이를 통해 책임 추가를 무한정으로 할 수 있다.

VisualComponent 클래스는 비주얼 객체를 위한 추상 클래스로, Draw와 이벤트 처리에 필요한 인터페이스를 정의한다. Decorator 클래스의 서브클래스는 필요한 서비스를 구현하기 위해 특정 기능을 수행하는 메서드를 추가로 구현할 수 있다.

장식자 패턴의 중요한 특성은 장식자는 어떤 형태의 VisualComponent에 모두 적용할 수 있다는 것이다. (VisualComponent 클래스의 모든 서브클래스에 추가적인 기능 제공 가능)

장점

  1. 단순한 상속보다 설계의 융통성을 더 많이 증대시킬 수 있다.
  2. 클래스 계통의 상부측 클래스에 많은 기능이 누적되는 상황을 피할 수 있다.

단점

  1. 장식자와 해당 그 장식자의 구성요소가 동일한 것은 아니다.
  2. 장식자를 사용함으로써 작은 규모의 객체들이 많이 생긴다. : 객체들을 모두 이해하고 수정하는 과정이 복잡해진다.

출처: GoF 의 디자인 패턴

--

--