티스토리 뷰

반응형

프록시 패턴 (Proxy Pattern)

 

'proxy'는 대리인이라는 뜻입니다. 자바 코드에서 생각을 해보면 어떤 클래스의 수행을 대신 수행 하는 것으로 생각 할 수 있습니다.

 

Proxy Pattern을 사용하는 경우는 어떤 클래스의 객체 생성이 오래 걸리는 경우 그 일을 분업을 하여 proxy 클래스에서 처리 할 수 있는 부분은 처리를 하고 proxy 클래스에서 처리 할 수 없는 작업에 대해서만 실제 클래스의 객체를 생성하고 위임하는 방식을 취합니다.

 

 

프록시 패턴 구조

 

 

● Client : proxy 패턴을 사용합니다.

 

● Subject : proxy와 RealSubject가 가져야 할 공통 인터페이스를 정의합니다.

 

Proxy : RealSubject에 대해 대리 수행을 실행합니다.

 

RealSubject : 실제 클래스에 해당됩니다.

 

 

예제 구현

1
2
3
4
5
6
7
public interface Subject {
    public void Show_Name();
    public void set_Name(String name);
    public void Complicated_Work();
    
}
 

 

먼저 proxy와 RealSubject를 동일시 하기 위해 공통 인터페이스를 정의합니다.

 

여기서 주목해야 할 메서드는 Complicated_Work() 메서드입니다. 이 메서드는 Proxy가 처리하지 않고 RealSubject의 인스턴스를 생성하여 RealSubject가 처리하도록 합니다.

 

나머지 메서드들에 대해서는 Proxy가 대리로 처리를 하게 됩니다.

 

 

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
public class proxy implements Subject{
    
    public Real_Subject subject;
    public String name;
    
    public void set_Name(String name)
    {
        System.out.println("proxy가 대신해서 처리 할 수 있어요.");
        if(subject!= null)
        {
            subject.set_Name(name);
        }
        this.name =name;
    }
    
    public void Show_Name()
    {
        System.out.println("proxy가 대신해서 처리 할 수 있어요.");
        System.out.println("my name is"+ name);
    }
    public void Complicated_Work()
    {
        subject = new Real_Subject();
        subject.Complicated_Work();
    }
    
}
 

 

다음은 Proxy입니다. set_Name()과 Show_Name() 메서드에 대해서 RealSubject가 처리하는게 아니라 Proxy가 처리하도록 합니다.

 

Complicated_Work() 메서드를 Proxy가 처리 할 수 없는 작업이라 가정을 하고 보게 되되면 이 메서드에 대한 처리 요청이 들어 올 때 비로소 Real_Subject의 인스턴스가 생성이 됩니다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class Real_Subject implements Subject {
    
    private String name;
    
    public void set_Name(String name)
    {
        this.name = name;
    }
    
    public void Show_Name()
    {
        System.out.println("my name is "+ name);
    }
    
    public void Complicated_Work()
    {
        System.out.println("proxy가 처리 못하는 작업을 수행합니다.");
    }
 
}
 

 

 

Real_Subject의 내용입니다. Proxy가 처리하지 못하는 Complicated_Work()에 대한 구현이 이루어집니다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class Main {
    
    public static void main(String argsp[])
    {    
        proxy proxy1 = new proxy();
        
        proxy1.set_Name("홍길동");
        System.out.println("================");
        
        proxy1.Show_Name();
        System.out.println("================");
        
        proxy1.Complicated_Work();
    }
 
}

 

 

실제 Proxy 패턴을 사용하는 사용자입니다. Proxy 인스턴스를 통해 Complicated_Work를 수행하지만 실제 사용자 입장에서는 누가 처리를 해주는지는 모르게 됩니다.

 

 

 

반응형

'Study > 디자인 패턴' 카테고리의 다른 글

08 반복자 패턴 (Iterator Pattern)  (0) 2017.09.24
07 브릿지 패턴 (Bridge Pattern)  (0) 2017.09.22
05 어댑터 패턴 (Adapter Pattern)  (0) 2017.09.16
04 Builder 패턴  (0) 2017.09.14
03 Template Method 패턴  (2) 2017.09.10