티스토리 뷰
프록시 패턴 (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 |