본문으로 바로가기
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.



데코레이터는 도장/도배업자를 의미한다. 여기서는 장식자라는 뜻을 가지고 논리를 풀어보자면, 데코레이터 패턴이 원본에 장식을 더하는 패턴이라는 것이 이름에 드러난다. 데코레이터 패턴은 프록시 패턴과 구현 방법이 같다. 차이점은 프록시 패턴은 클라이언트가최종적으로 돌려 받는 반환값을 조작하지 않고 그대로 전달하는 반면, 데코레이터 패턴은 클라이언트가 받는 반환값에 장식을 덧입힌다. 


데코레이터 패턴의 중요 포인트


1. 장식자는 실제 서비스와 같은 이름의 메서드를 구현한다. 이때 인터페이스를 사용한다.

2. 장식자는 실제 서비스에 대한 참조 변수를 갖는다.

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

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


 프록시 패턴

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

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

 데코레이터 패턴 

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


데코레이터 패턴을 이해하려면 프록시 패턴을 먼저 알고 가는 것이 중요하다.! 아래 예제는 프록시 패턴을 정말 몇줄 변형했기 때문에 프록시 패턴을 먼저 이해하고 데코레이터 패턴으로 넘어가자!!!!


프록시 패턴 이해하기


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
interface IService {
    public String greeting(String str);
}
 
class Service implements IService{
 
    @Override
    public String greeting(String str) {
        // TODO Auto-generated method stub
        
        return "안녕하세요 " + str + "입니다.";
    }
}
 
class Decorator implements IService {
    IService iService;
    
    @Override
    public String greeting(String str) {
        // TODO Auto-generated method stub
        iService = new Service();
        System.out.println("호출에 대한 장식이 주목적이며, 클라이언트에게 반환 결과에 장식을 더하여 전달한다.");
        
        return iService.greeting("서울에 살고 있는 " + str);
    }
    
}
 
public class DecoratorPattern {
    public static void main(String[] args) {
        IService service = new Decorator();
        System.out.println(service.greeting("ktko"));
    }
}
cs


데코레이터(장식자)라는 이름에서 보듯이 실제 서비스의 반환 값을 다시 포장하여 사용하는 것이 데코레이터 패턴이다. 데코레이터 패턴을 정의하자면 "메서드 호출의 반환값에 변화를 주기 위해 중간에 장식자를 두는 패턴" 이라고 할 수 있다.


데코레이터 패턴이 프록시 패턴과 동일한 구조를 갖기 때문에 데코레이터 패턴도 개방 폐쇄 원칙(OCP)와 의존 역전 원칙(DIP)이 적용된 설계 패턴임을 알 수 있다.