먼저 Image 라는 인터페이스에서는 이를 구현하는 클래스라면 반드시 displayImage()라는 메소드를 구현하도록 되어있습니다. UML에서와 같이 클라이언트측에 있는 ProxyImage 클래스와 서버측에 있는 RealImage 클래스가 위의 인터페이스를 구현하는것을 볼 수 있습니다.
ProxyImage 클래스는 두가지의 Attribute를 가지고 있습니다. 첫번째로는 filename이라는 String 객체와 ProxyImage와 더불어 Image 인터페이스를 구현하는 RealImage 클래스 형의 객체를 가지고 있습니다. 구현하는 인터페이스가 가진 displayImage() 메소드를 구현해 놓았는데, image 객체가 가르키는 레퍼런스가 없을때만 새로운 객체를 생성하고 RealImage 클래스에 있는 displayImage() 메소드를 수행합니다.
RealImage 클래스에는 filename이라는 attribute만이 존재하며 생성자에는 새로운 객체를 생성함과 동시에 Loading이라고 콘솔창에 출력하므로서 객체가 생성되는것을 볼수 있게 해주었으며 displayImage() 메소드는 해당 객체의 filename이라는 변수와 함께 Displaying 이라고 출력이 되도록 해놓았습니다.
위와같은 Virtual Proxy Pattern을 테스트 하기 위해서 샘플 코드를 작성했습니다.
import java.util.*;
public class ProxyExample {
public static void main(String[] args) {
List<Image> images = new ArrayList<Image>();
images.add(new ProxyImage("HiRes_10MB_Photo1"));
images.add(new ProxyImage("HiRes_10MB_Photo2"));
images.add(new ProxyImage("HiRes_10MB_Photo3"));
images.get(0).displayImage(); // Loading이 필요합니다.
images.get(1).displayImage(); // Loading이 필요합니다.
images.get(0).displayImage(); // Loading이 필요하지 않습니다.
//세번째 displayImage() 메소드에 대해서는 따로 객체를 생성하지 않습니다.
}
}
위와 같은 소스코드를 실행 시키면 어떤 결과가 나올까요?
간단하지만 많은 것을 알 수 있게 해주는 예제였습니다. 이런 방식이 RMI의 기초가 된다고 합니다. 다음번에는 RMI에 대해서도 알아보도록 하겠습니다 ^^TheProxyImage
class is used to delay the expensive operation of loading a file from disk until the result of that operation is actually needed. If the file is never needed, then the expensive load has been totally eliminated.
ProxyImage 클래스는 실제로 실행의 결과가 필요할때 까지 디스크로부터 파일을 읽어오는 고비용의 실행을 지연하기 위해 사용이됩니다. 만약에 그 파일이 필요해지지 않으면 고비용의 load는 결국은 사라지게 될 것 입니다.