5. 데코레이터 패턴 - midoBanDev/design-pattern-java GitHub Wiki
데코레이터 패턴
데코레이터 패턴은 부가 기능 추가라는 의도를 가진 프록시를 사용한 패턴이다.
- 클라이언트는 Component 인터페이스와 의존관계를 가진다. 실제 요청 처리는 RealComponent 객체가 처리한다.
코드
1. 인터페이스 기반 데코레이터 패턴
- Component 인터페이스
public interface Component {
String operation();
}
- RealComponet 구현 클래스
@Slf4j
public class RealComponent implements Component{
@Override
public String operation() {
log.info("RealComponent 실행");
return "data";
}
}
- MessageDecorator 구현 클래스
@Slf4j
public class MessageDecorator implements Component{
private Component component;
public MessageDecorator(Component component) {
this.component = component;
}
@Override
public String operation() {
log.info("MessageDecorator 실행");
String result = component.operation();
String decoResult = "****" + result + "****";
log.info("꾸미기 적용 전={}, 후={}", result, decoResult);
return decoResult;
}
}
- 데코레이터 클라이언트 클래스
@Slf4j
public class DecoratorPatternClient {
private Component component;
public DecoratorPatternClient(Component component) {
this.component = component;
}
public void execute() {
String result = component.operation();
log.info("result={}", result);
}
}
- 데코레이터 패턴 실행 코드
- 데코레이터 클라이언트는 Component와 의존관계를 맺는다.
- 데코레이터 클라이언트에 Component를 구현한 MessageDecorator 클래스를 주입해 준다.
- MessageDecorator 클래스에 실제 요청 처리를 맡은 RealComponent 클래스를 주입해 준다.
- 전제흐름
- 클라이언트가 execute() 요청을 하면 우선 MessageDecorator가 해당 요청을 전달 받은 후 RealComponent에게 실제 요청 처리를 넘긴다
- RealComponent는 요청을 처리한 후 결과값을 MessageDecorator에게 넘긴다.
- MessageDecorator는 넘겨 받은 결과값에 부가기능을 추가 한 후 클라이언트에게 최종 결과를 응답한다.
public class DecoratorPatternTest {
@Test
void decorator1() {
Component realComponent = new RealComponent();
Component messageDecorator = new MessageDecorator(realComponent);
DecoratorPatternClient client = new DecoratorPatternClient(messageDecorator);
client.execute();
}
}
- 데코레이터 패턴은 여러개의 부가기능을 추가할 수 있다. MessageDecorator 뿐만 아니라 꾸미고 싶은 만큼 계속 추가할 수 있다.
- TImeDecorator를 추가하고 싶은 경우 아래 코드처럼 얼마든지 가능하다.
public class DecoratorPatternTest {
@Test
void decorator2() {
Component realComponent = new RealComponent();
Component messageDecorator = new MessageDecorator(realComponent);
Component timeDocorator = new TImeDecorator(messageDecorator);
DecoratorPatternClient client = new DecoratorPatternClient(timeDocorator);
client.execute();
}
}