5. 데코레이터 패턴 - midoBanDev/design-pattern-java GitHub Wiki

데코레이터 패턴

데코레이터 패턴은 부가 기능 추가라는 의도를 가진 프록시를 사용한 패턴이다.

  • 클라이언트는 Component 인터페이스와 의존관계를 가진다. 실제 요청 처리는 RealComponent 객체가 처리한다.

image

코드

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);
	}
}
  • 데코레이터 패턴 실행 코드
  1. 데코레이터 클라이언트는 Component와 의존관계를 맺는다.
  2. 데코레이터 클라이언트에 Component를 구현한 MessageDecorator 클래스를 주입해 준다.
  3. MessageDecorator 클래스에 실제 요청 처리를 맡은 RealComponent 클래스를 주입해 준다.
  • 전제흐름
  1. 클라이언트가 execute() 요청을 하면 우선 MessageDecorator가 해당 요청을 전달 받은 후 RealComponent에게 실제 요청 처리를 넘긴다
  2. RealComponent는 요청을 처리한 후 결과값을 MessageDecorator에게 넘긴다.
  3. 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();
	}
}