데코레이터 패턴
-
date_range 14/02/2020 00:00 infosortDesign_PatternlabelDesign_Pattern
데코레이터 패턴이 원본에 장식을 더하는 패턴이라는 것이 이름에 잘 드러나 있다.
데코레이터 패턴은 프록시 패턴과 구현 방법이 같다. 다만 프록시 패턴은 클라이언트가 최종적으로 돌려받는 반환값을 조작하지 않고 그대로 전달하는 반면 데코레이터 패턴은 클라이언트가 받는 반환값에 장식을 덧입힌다.
프록시 패턴 | 제어의 흐름을 변경하거나 별도의 로직 처리를 목적으로 한다. |
---|---|
클라이언트가 받는 반환값을 특별한 경우가 아니면 변경하지 않는다. | |
데코레이터 패턴 | 클라이언트가 받는 반환값에 장식을 한다. |
프록시 패턴
- 제어의 흐름을 변경하거나 별도의 로직 처리를 목적으로 한다.
- 클라이언트가 받는 반환값을 특별한 경우가 아니면 변경하지 않는다.
데코레이터 패턴
- 클라이언트가 받는 반환값에 장식을 더한다.
IService.java
package decoratorPattern;
public interface IService{
public abstract String runSomething();
}
IService 인터페이스를 구현한 Service.java
package decoratorPattern;
public class Service implements IService{
public String runSomething(){
return "서비스 짱!!";
}
}
IService 인터페이스를 구현한 Decorator.java
package decoratorPattern;
public class Decorator implements IService{
IService service;
public String runSomething(){
System.out.println("호출에 대한 장식 주목적, 클라이언트에게 반환 결과에 장식을 더하며 전달");
service = new Service();
return "정말" + service.runSomething();
}
}
데코레이터를 사용하는 ClientWithDecorator.java
package decoratorPattern;
public class ClientWithDecorator{
public class void main(String[] args){
IService decorator = new Decorator();
System.out.println(decorator.runSomething());
}
}
데코레이터 패턴의 중요 포인트
- 장식자는 실제 서비스와 같은 이름의 메서드를 구현한다. 이때 인터페이스를 사용한다.
- 장식자는 실제 서비스에 대한 참조 변수를 갖는다(합성).
- 장식자는 실제 서비스의 같은 이름을 가진 메서드를 호출하고, 그 반환값에 장식을 더해 클라이언트에게 돌려준다.
- 장식자는 실제 서비스의 메서드 호출 전후에 별도의 로직을 수행할 수도 있다.
한마디로 정리하자면,
메서드 호출의 반환값에 변화를 주기 위해 중간에 장식자를 두는 패턴
이라고 할 수 있다.