데코레이터 패턴(Decorator Pattern)
- 데코레이터 패턴은 프록시 기법을 사용하는 디자인 패턴 중에 하나입니다.
- GOF 디자인 패턴에서는 의도에 따라 두 가지 패턴으로 구분하였습니다.
프록시의 주요 기능
프록시를 통해서 할 수 있는 일은 크게 2가지로 나뉜다.
1. 접근 제어 (권한에 따른 접근 차단, 캐싱 등)
2. 부가 기능 추가 (다른 로직을 추가하는 등의 부가 기능을 수행, 예) 실행 시간을 측정해서 로그를 남긴다.)
* GOF 디자인 패턴에서는 의도에 따라서 프록시 패턴과, 데코레이터 패턴으로 구분한다.
- 프록시 패턴 : 접근 제어가 목적
- 데코레이터 패턴 : 새로운 기능 추가가 목적
프록시 패턴의 장점
- 부가 기능을 추가하여서 원하는 흐름에 맞게 조정할 수 있습니다.
코드
* 메시지를 출력하는 기능에 메시지를 꾸며주는 기능을 데코레이터 패턴을 이용해서 적용해 보겠습니다.
Component.java
- interface로 Component 생성
public interface Component {
String operation();
}
RealComponent.java
- 실제 Component 구현체
@Slf4j
public class RealComponent implements Component{
@Override
public String operation() {
log.info("RealComponent 실행");
return "data";
}
}
DecoratorPatternClient.java
- Component를 실행하는 클라이언트 클래스
@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);
}
}
DecoratorPatternTest.java
- 기본 메시지 출력 기능 테스트
@Slf4j
public class DecoratorPatternTest {
@Test
void noDecorator() {
Component realComponent = new RealComponent();
DecoratorPatternClient client = new DecoratorPatternClient(realComponent);
client.execute();
}
}
결과 : RealComponent 실행
result=data
MessageDecorator.java
- 데코레이터 패턴을 이용해서 메시지 꾸며주는 기능 추가
- MessageDecorator는 Component 인터페이스를 구현한다.
@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("MessageDecorator 꾸미기 적용 전={}, 적용 후 ={}",result, decoResult);
return decoResult;
}
}
DecoratorPatterTest.java
- 클라이언트가 호출하기 전에 MessageDecorator 클래스를 이용해서 부가 기능을 추가 후 클라이언트에게 messageDecorator를 넘겨준다. messageDecorator도 Component를 구현하고 있기 때문에 클라이언트 입장에서는 전혀 문제가 발생하지 않는다.
@Slf4j
public class DecoratorPatternTest {
@Test
void decorator1() {
Component realComponent = new RealComponent();
Component messageDecorator = new MessageDecorator(realComponent);
DecoratorPatternClient client = new DecoratorPatternClient(messageDecorator);
client.execute();
}
}
결과 :
정리 :
데코레이터 패턴의 의도 : 객체에 추가 책임(기능)을 동적으로 추가하고, 기능 확장을 위한 유연한 대안 제공
프록시 패턴의 의도 : 다른 객체에 대한 접근을 제어하기 위해 대리자를 제공
'JAVA > Design Pettern' 카테고리의 다른 글
[Design Pattern] 전략 패턴 (0) | 2022.09.11 |
---|---|
[Design Pattern] 프로토타입 패턴 (0) | 2022.04.27 |
[Design Pattern] 커맨드 패턴 (0) | 2022.03.25 |
[Design Pattern] 책임 사슬 패턴 (0) | 2022.03.24 |
[Design Pattern] 템플릿 메서드 패턴 (0) | 2022.03.23 |