블링블링 범블링

프록시 패턴(Proxy Pattern) 본문

Technology/객체 지향 디자인 패턴

프록시 패턴(Proxy Pattern)

뻠스키 2018. 4. 18. 11:33

프록시 패턴(Proxy Pattern)



프록시의 의미는 "대리자"라는 의미다.  무언가를 대신해서 일을 해주는 사람을 말하는데 프록시패턴(Proxy Pattern)은 대리자로써 일을 맡기면 그 일을 처리하고 완료되면 결과를 알려주는 패턴이다. 


프록시 패턴을 사용하는 대표적인 예로는 imageListView가 있다. 이미지를 리스트를 통해서 보여줘야하 하는 상황일 때, 화면에 보이지 않는 이미지뷰도 로딩을 하면 이미지를 불러오는 시간 때문에 대기시간일 길어질 수도 있고, 메모리를 많이 차지하게 된다. 

이러한 점을 해결하기 위한 방법은 이미지캐시방법이 있다. 매번 새롭게 이미지를 로딩하는 것이 아니라 메모리나 디스크에 저장해서 매번 이미지를 로딩하지 않고, 이미지를 캐시하는 방법이다. 

하지만 이미지를 로딩하는 방식을 변경하는 시점을 수정할 할 때 매번 imageListView에서 코드를 변경해야한다. 이 때 실제 화면에 보여지는 imageListView의 코드의 변경 없이 이미지의 로딩 방식을 필요에 따라 사용하도록 프록시 객체에 위임하는 것이 프록시패턴이다. 이 것의 장점은 로딩 방식이 변경되었을 때 imageListView에 영향이 없다는 점이다.




클라이언트는 이미지로딩을 요청할 때 그 일을 실제 객체가 일하는지 프록시 객체가 하는 지 알 수 없지만 프록시 객체가 실제 객체를 대신해 실제 객체의 생성이나 접근 등을 제어할 수 있도록 한다.


[소스코드]


[imageListView : Subject]

1
2
3
public interface imageListView {
    public void draw();
}


[ProxyImage : Proxy]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class ProxyImage implements imageListView {
     
    private RealImage image;
    private String imageName;
     
    public ProxyImage(String imageName) {
        this.imageName= imageName;
    }
     
    @Override
    public void draw() {
        if(image == null) {//디스크에 이미지가 없으면 로딩하기
            image = new RealImage(imageName);
            image.draw();
        }
        else image.diskImage();
    }
 
}


[RealImage : Realsubject]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class RealImage implements imageListView{
     
    private String imageName;
     
    public RealImage(String imageString) {
        this.imageName = imageString;
    }
     
    @Override
    public void draw() {
        // TODO Auto-generated method stub
        System.out.println("이미지  로딩 : "+ imageName);
    }
     
    public void diskImage() {
        System.out.println("이미지 캐싱 : "+ imageName);
    }
 
}

[Main : client]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Main {
    public static void main(String[] args) {
         
        imageListView image = new ProxyImage("file");
        imageListView image1 = new ProxyImage("file1");
         
        image.draw();
        image.draw();
        image.draw();
        image1.draw();
        image1.draw();
        image1.draw();
         
    }
}


[출력화면]


출력화면을 통해서 이미지뷰에서 이미지로딩을 요청했을 때 디스크에 이미지가 없으면 로딩을 하고, 있으면 이미지 캐싱을 하는 것을 볼 수있다. 이미지뷰는 직접 로딩을 했는 지와 캐싱을 했는 지 알 수 없고 프록시가 대신해서 필요에 따라 이미지 로딩방식을 선택하는 것을 볼 수 있다.


이 전에 정리했던 데코레이터 패턴과 객체에게 역할을 위임한다는 점에서 비슷할 수 있지만 데코레이터는 기능을 확장시키기 위한 목적이었고, 프록시는 실제 객체에 접근하기 위한 목적을 가지고 있다는 점에서 다르다.


참고  위키디피아 블로그

출처 : http://meylady.tistory.com/

Comments