본문 바로가기

스프링

[Spring] 디자인 패턴 - 데코레이터 패턴 예시

참고 1. 스프링-핵심-원리-고급편, 김영한
참고 2. 위키백과

 

데코레이터 패턴의 전체적인 틀은 프록시 패턴과 동일하다. 

1. Component 인터페이스

실제 객체와 부가 기능 추가를 위한 데코레이터의 인터페이스를 정의한다.

public interface Component {
    String operation();
}

2. 실제 서버에 대한 객체

실제 서버에 대한 객체를 정의한다.

@Slf4j
public class RealComponent implements Component{
    @Override
    public String operation() {

        log.info("RealComponent 실행");
        return "data";
    }
}

3. Decorator 정의

위 실제 서버를 주입받고, 해당 서버에 추가할 부가 기능에 대한 데코레이터를 정의한다. 아래의 데코레이터는 위 실제 서버 컴포넌트를 주입받고, 문자열을 변경하는 부가 기능을 추가한다.

@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("MessageDeco 적용전={}, 적용후={}", result, decoResult);
        return decoResult;
    }
}

 

데코레이터 적용 예시


@Slf4j
public class DecoratorPatternTest {

    @Test
    void noDecorator() {
        Component realComponent = new RealComponent();
        DecoratorPatternClient client = new DecoratorPatternClient(realComponent);

        client.execute();
    }

    @Test
    void Decorator() {
        Component realComponent = new RealComponent();
        Component MessageDeco = new MessageDecorator(realComponent);
        DecoratorPatternClient client = new DecoratorPatternClient(MessageDeco);

        client.execute();
    }

}