데코레이터 패턴
- 프록시를 사용하여 새로운 기능을 추가하는 것을 목적으로 하는 패턴
데코레이터 패턴 - 예제 코드1
- 데코레이터 패턴을 적용해보기 전에 일반적인 코드로 작성하면 어떻게 동작하는지 확인해보자.
Component
- 간단하게 operation 메소드만 추가한다.
RealComponent
- Component 인터페이스를 구현한다.
- operation에는 단순하게 데이터를 반환하는 로직을 작성한다.
DecoratorPatternClient
- Component 인터페이스에 의존하는 클라이언트 코드
DecoratorPatternTest
- 테스트를 생성한다.
- noDecorator 실행 로그
com.example.pureproxy.decorator.RealComponent – RealComponent 실행
com.example.pureproxy.decorator.DecoratorPatternClient – result=data
데코레이터 패턴 - 예제 코드2
- 이번에는 실제로 데코레이터 패턴을 적용해보자.
- 응답 메시지를 꾸며주는 데코레이터를 생성하고 적용할 것이다.
- 데코레이터 적용 시 런타임 객체 의촌 관게는 아래와 같이 바뀐다.
flowchart LR A[Client] ----> B[messageDecorator] B ----> C[reaalComponent]
MessageDecorator
- 응답 값을 꾸며주는 데코레이터 프록시
- Component 인터페이스를 구현한다.
- 프록시가 호출해야 하는 대상을 component에 저장한다.
DecoratorPatternTest
- 데코레이터 적용 결과를 확인하기 위해 DecoratorPatternTest에 메서드를 추가하자.
- client → messageDecorator → realComponent 순서로 객체 의존 관계를 생성한다.
- decorator1 실행 로그
com.example.pureproxy.decorator.MessageDecorator – MessageDecorator 실행
com.example.pureproxy.decorator.RealComponent – RealComponent 실행
com.example.pureproxy.decorator.MessageDecorator – MessageDecorator 꾸미기 적용 전=data, 적용 후=**data**
com.example.pureproxy.decorator.DecoratorPatternClient – result=**data** - 실행 결과를 보면 MessageDecorator가 RealComponent를 호출하고 반환한 응답 메시지를 꾸며서 반환한 것을 확인할 수 있다.
데코레이터 패턴 - 예제 코드3
- 데코레이터는 하나만 적용할 수 있는게 아닌 복수로 적용할 수 있다.
- 이번에는 실행 시간을 측정하는 기능의 데코레이터를 생성하고 적용도 해보자.
- 데코레이터 적용 시 런타임 객체 의촌 관게는 아래와 같이 바뀐다.
flowchart LR A[Client] ----> B[timeDecorator] B ----> C[messageDecorator] C ----> D[reaalComponent]
TimeDecorator
- 실행 기능을 측정하는 데코레이터다.
- 대상을 호출하기 전에 시간을 가지고 있다가, 대상의 호출이 끝나면 호출 시간을 로그로 남겨준다.
DecoratorPatternTest
- 데코레이터 적용 결과를 확인하기 위해 DecoratorPatternTest에 메서드를 추가하자.
- client → timeDecorator → messageDecorator → realComponent 순서로 객체 의존 관계를 생성한다.
- decorator2 실행 로그
com.example.pureproxy.decorator.TimeDecorator – TimeDecorator 실행
com.example.pureproxy.decorator.MessageDecorator – MessageDecorator 실행
com.example.pureproxy.decorator.RealComponent – RealComponent 실행
com.example.pureproxy.decorator.MessageDecorator – MessageDecorator 꾸미기 적용 전=data, 적용 후=**data**
com.example.pureproxy.decorator.TimeDecorator – TimeDecorator 종료 resultTime=2ms
com.example.pureproxy.decorator.DecoratorPatternClient – result=**data**