본문 바로가기

Design Patterns/영문 위키(Wikipedia)

Proxy pattern (프록시 패턴)

먼저 이 글은 영문 위키의 글을 번역한 글임을 알려드립니다.

영어 실력이 부족한 관계로 오역이 있을 수 있습니다.

원문 주소 : http://en.wikipedia.org/wiki/Proxy_pattern



구조적 패턴 - 프록시 패턴



컴퓨터 프로그래밍(computer programming)에서 프록시 패턴은 소프트웨어 디자인 패턴(software design pattern) 중 하나이다. 


가장 일반적인 형태의 프록시는 뭔가 다른 것의 인터페이스로 동작하는 클래스의 형태이다. 프록시는 어떤 인터페이스든지 가능하다. : 네트웍 연결, 메모리의 큰 객체, 파일, 또는 비용이 많이 들거나 복제하기 거의 불가능한 자원.


프록시 패턴의 잘 알려진 예는 참조 카운팅 포인터(reference counting pointer)객체이다. 


복잡한 객체를 여러개 복사해야하는 상황이 있다면, 프록시 패턴은 애플리케이션의 메모리 공간을 줄이기 위해 flyweight pattern에 맞춰질 수도 있다. 일반적으로 복잡한 객체 하나와 여러개의 프록시 객체들이 만들어지면, 이들 모두는 하나의 원본 복합 객체에 대한 참조를 포함한다 .프록시에서 수행되는 어떠한 동작(operations)들도 원본 객체로 연결되어진다.(forwared.. 포워드한다는 말인데, 원본 객체에게 위임한다는 표현이 더 어울릴 수도 있겠네요.) 일단 프록시의 모든 객체들이 영역 밖이라면, 복합 객체의 메모리는 해제될지도 모른다.




예 Example

아래의 자바 예는 가상 프록시(virtual proxy) 패턴을 보여주고 있다. ProxyImage 클래스는 원격 메서드에 접근하기 위해서 사용된다.

interface Image {
    void displayImage();
}
 
// on System A 
class RealImage implements Image {
    private String filename;
 
    public RealImage(String filename) { 
        this.filename = filename;
        loadImageFromDisk();
    }
 
    private void loadImageFromDisk() {
        System.out.println("Loading   " + filename);
    }
 
    public void displayImage() { 
        System.out.println("Displaying " + filename); 
    }
 
}
 
//on System B 
class ProxyImage implements Image {
    private String filename;
    private RealImage image;
 
    public ProxyImage(String filename) { 
        this.filename = filename; 
    }
 
    public void displayImage() {
        if (image == null) {
           image = new RealImage(filename);
        } 
        image.displayImage();
    }
}
 
class ProxyExample  {
    public static void main(String[] args) {
        Image image1 = new ProxyImage("HiRes_10MB_Photo1");
        Image image2 = new ProxyImage("HiRes_10MB_Photo2");     
 
        image1.displayImage(); // loading necessary
        image1.displayImage(); // loading unnecessary
        image2.displayImage(); // loading necessary
        image2.displayImage(); // loading unnecessary
        image1.displayImage(); // loading unnecessary
    }
}

프로그램의 결과는 아래와 같다.

Loading   HiRes_10MB_Photo1
Displaying HiRes_10MB_Photo1
Displaying HiRes_10MB_Photo1
Loading   HiRes_10MB_Photo2
Displaying HiRes_10MB_Photo2
Displaying HiRes_10MB_Photo2
Displaying HiRes_10MB_Photo1