less than 1 minute read

데코레이터 패턴

객체에 동적으로 새로운 책임을 추가하는 것
  • 명칭

    데코레이터 패턴, 장식자 패턴, 래퍼 패턴

  • 의도

    객체에 동적으로 새로운 책임을 추가하하는 것

    서브클래스를 생성하는 것보다 융통성 있는 방법

  • 동기

    새로운 서비스의 추가가 필요할 때 일반적인 방법인 상속이 있지만 기능이 정적임

    개선방법으로 기존의 객체에 새로운 서비스를 추가하는 객체 즉, 장식자(decorator)로 기존의 객체를 둘러싸는 것

    데코레이터는 자신이 둘러싼 구성요소로 전달되는 요청을 중간에서 가로채서 해당 구성요소에 전달해줌

    구성요소가 갖는 인터페이스를 자신도 동일하게 제공하므로 사용자는 데코레이터의 존재를 알 수 없음

    투명성이 존재하기 때문에 장식자의 중첩이 가능해서 기능을 무한정으로 할 수 있음

  • 사용 시기

    객체의 타입, 호출 가능한 메서드를 그대로 유지하면서 객체에 새로운 책임을 추가할 때

    탈부착 가능한 기능을 정의할 때

    상속을 통해 서브클래스를 계속 만드는 방법이 비효율적일때

  • 고려 사항

    컴포넌트는 데코레이터를 추가할 베이스가 되므로 작고 가볍게 정의

    상속 구조를 통해 데코레이터와 컴포넌트가 같은 인터페이스 가져야 컴포넌트 메서드 계속 사용 가능

    코드 수정하지 않고도 준비된 데코레이터를 조합해 기능 추가할 수 있도록 구현

    비슷한 성질의 작은 클래스가 많이 만들어질 수 있다는 단점 고려

    구현하려는 내용이 객체의 겉/속 변경인지 생각하고 속일 시 다른 패턴 사용

    사용이 까다로우면 다른 패턴 고려

    데코레이터가 다른 데코레이터에 대해 알아야 할 시 패턴의 사용 의도와 어긋나는 작업일 수 있음

    데코레이터 추가할 때 마다 얻은 아이템을 List 로 관리하는 방법 있음