유래반복된 문제에 대한 재사용 가능한 해결책
구조적 디자인 패턴(Structural Design Pattern)이란?기존 객체의 동작을 동적으로 증강시키는 구조적 디자인 패턴
이벤트 발생에 대한 이메일 알람을 보내는 Notifier
라는 클래스를 지닌 라이브러리를 생각해보자. 그리고 이 라이브러리를 사용하여 프로그램을 개발한 개발자 홍길동을 생각해보자.
홍길동은 자신의 프로그램 사용자들이 이메일 뿐 아니라 다양한 곳에서 알람을 받길 원한다는 것을 깨닫고 이를 상속으로 해결하였다.
그러나 사람들은 점점 더 많은 것을 요구한다... 한 곳에서 뿐 아니라 다양한 곳에서 한 번에 알람을 받길 원하는... 만약 언어가 다중 상속을 지원하지 않는다면 자식 클래스의 수는 걷잡을 수 없이 늘어날 수 있다.
즉, 상속이 아닌 Aggregation 이나 Composition 을 사용하여 기본이 되는 서비스 메서드를 제공하는 객체(위 예에선 Notifier
의 인스턴스)를 참조 값으로 가지고 있는 'Helper' 객체를 통해 수정하는 것.
데코레이팅(혹은 래핑)할 객체와 동일한 인터페이스를 지닌 베이스 데코레이터를 생성한 후, 필요에 따라 베이스 데코레이터를 상속하여 확장하는 형태. 이후 클라이언트는 원하는 기능을 동적으로 데코레이팅하여 사용할 수 있다.
위 예시에서 상속을 사용해서 발생했던 코드 증대의 문제는 데코레이터를 사용하여 아래 그림과 같이 해결될 수 있다.
final
키워드 사용 등, 더 이상 상속이 불가능할 때