데코레이터
데코레이터 패턴
객체에 동적으로 새로운 책임을 추가하는 것
-
명칭
데코레이터 패턴, 장식자 패턴, 래퍼 패턴
-
의도
객체에 동적으로 새로운 책임을 추가하하는 것
서브클래스를 생성하는 것보다 융통성 있는 방법
-
동기
새로운 서비스의 추가가 필요할 때 일반적인 방법인 상속이 있지만 기능이 정적임
개선방법으로 기존의 객체에 새로운 서비스를 추가하는 객체 즉, 장식자(decorator)로 기존의 객체를 둘러싸는 것
데코레이터는 자신이 둘러싼 구성요소로 전달되는 요청을 중간에서 가로채서 해당 구성요소에 전달해줌
구성요소가 갖는 인터페이스를 자신도 동일하게 제공하므로 사용자는 데코레이터의 존재를 알 수 없음
투명성이 존재하기 때문에 장식자의 중첩이 가능해서 기능을 무한정으로 할 수 있음
-
사용 시기
객체의 타입, 호출 가능한 메서드를 그대로 유지하면서 객체에 새로운 책임을 추가할 때
탈부착 가능한 기능을 정의할 때
상속을 통해 서브클래스를 계속 만드는 방법이 비효율적일때
-
고려 사항
컴포넌트는 데코레이터를 추가할 베이스가 되므로 작고 가볍게 정의
상속 구조를 통해 데코레이터와 컴포넌트가 같은 인터페이스 가져야 컴포넌트 메서드 계속 사용 가능
코드 수정하지 않고도 준비된 데코레이터를 조합해 기능 추가할 수 있도록 구현
비슷한 성질의 작은 클래스가 많이 만들어질 수 있다는 단점 고려
구현하려는 내용이 객체의 겉/속 변경인지 생각하고 속일 시 다른 패턴 사용
사용이 까다로우면 다른 패턴 고려
데코레이터가 다른 데코레이터에 대해 알아야 할 시 패턴의 사용 의도와 어긋나는 작업일 수 있음
데코레이터 추가할 때 마다 얻은 아이템을 List 로 관리하는 방법 있음