본문 바로가기

용어정리/#디자인패턴

용어정리-[#디자인패턴] 3.Decorator Pattern


[ Decorator Pattern ]

데코레이터 패턴


2018 - 06 - 01


데코레이터 패턴은 도장/도배업자를 의미한다.


데코레이터 패턴이 원본에 장식을 더하는 패턴이라는 것이 이름에 잘 드러나 있다.


데코레이터 패턴은 프록시와 구현 방법이 같다.


다만 프록시 패턴은 

클라이언트가 최종적으로 돌려 받는 반환값을 조작하지 않고 그대로 전달하는 반면


데코레이터 패턴은

클라이언트가 받는 반환값에 장식을 덧입힌다.


 프록시 패턴

 제어의 흐름을 변경하거나 별도의 로직 처리를 목적으로 한다.

 클라이언트가 받는 반환값을 특별한 경우가 아니면 변경하지 않는다

 데코레이터 패턴

 클라이언트가 받는 반환값에 장식을 더한다. 


코드를 살펴보자

IService.java

1
2
3
4
5
package decoratorPattern;
 
public class IService {
    public abstract String runSomething();
}
cs


IService 인터페이스를 구현한 Service.java

1
2
3
4
5
6
7
package decoratorPattern;
 
public class Service implements IService {
    public String runSomething(){
        return "서비스 짱!!!";
    }
}
cs

IService 인터페이스를 구현한 Decorator.java

1
2
3
4
5
6
7
8
9
10
11
12
package decoratorPattern;
 
public class Decorator implements IService {
    IService service;
 
    public String runSomething(){
        System.out.println("호출에 대한 장식 주목적, 클라이언트에게 반환 결과에 장식을 더하여 전달");
    
        service = new Service();
        return "정말" + service.runSomething();
    }
}
cs


데코레이터를 사용하는 ClientWithDecorator.java

1
2
3
4
5
6
7
8
9
package decoratorPattern;
 
public class ClientWithDecorator {
    public static void main(String[] args){
        Decorator decorator = new Decorator();{
        System.out.println(decorator.runSomething());
        }
    }    
}
cs


데코레이터 패턴의 중요 포인트를 짚어 보자.


반환값에 장식을 더한다는 것을 빼면 프록시 패턴과 동일하다.


  • 장식자는 실제 서비스와 같은 이름의 메서드를 구현한다. 이 때 인터페이스를 사용한다.
  • 장식자는 실제 서비스에 대한 참조 변수를 갖는다(합성)

  • 장식자는 실제 서비스의 같은 이름을 가진 메서드를 호출하고,
    그 반환값에 장식을 더해 클라이언트에게 돌려준다.

  • 장식자는 실제 서비스의 메서드 호출 전후에 별도의 로직을 수행할 수도 있다.


장식자라는 이름에서 느껴지듯 실제 서비스의 반환 값을 포장(장식)하는 패턴이

데코레이터 패턴임을 기억하자.


마지막으로 데코레이터 패턴을 한 문장으로 정리하면 다음과 같다.


"메서드 호출의 반환값에 변화를 주기 위해 중간에 장식자를 두는 패턴"



출처

스프링 입문을 위 한 자바 객체 지향의 원리와 이해

김종민 저