기본 아이디어
어떤 객체(Real Object)를 Real Subject와 동일한 인터페이스를 구현한 다른 중개 객체(Proxy)를 통해 접근하는 것이 땔는 편리할 수 있다는 것이다. 중개 객체는 게으를 초기화(값비싼 필드 등을 필요시 로딩)와 같은 일을 하게 된다.
/** A Map proxy that handles lazy instantiation of tables from the disk.**/
private final class TableMap implements Map
{
private final Map realMap;
public TableMap( Map realMap )
{
this.realMap = realMap;
}
}
TableMap이 자신이 포함하고 있는 realMap 객체의 프록시가 된다.
- 리모트 프록시(Remote proxy)
: 네트워크 연결의 한 종단에 존재하며 네트워크의 다른 쪽에 있는 객체와 동일한 인터페이스를 구현한다. 사용자는 프록시에 메시지를 보내며, 프록시가 이 메시지를 네트워크 너머에 있는 실제 객체로 전달하게 된다. 이때 사용자는 프록시를 네트워크 너머에 있는 리포트 객체라 생각한다. 프록시를 통해 일어나는 모든 통신은 투명하게 리포트 객체에 전달되기 때문이다. 자바 RME, COBRA 그리고 XML/SOAP 모두 리포트 프록시 아키택처를 사용하고 있다.
- 가상 프록시(virtual proxy)
: Java.awt.Image 클래스, 이는 로딩될 실제 이미지에 대한 프록시 기능한다. Runtime.getImage()는 백그라운드 스레드가 네트워크를 통해 실제 이미지를 다운로드 하고 있는 동안, 실제 이미지에 대한 프록시를 반환한다. 이미지가 전부 다운로드 되기 전에도 프록시(getImage()가 반환한 이미지)를 사용할 수 있다. 이미지 다운로드가 끝나년 getImage() 메소드는 프록시가 아닌 실제 이미지를 반환한다.
CF> Decorator 패턴, Proxy 패턴, Chain of Responsibility 패턴 : 정정구조 대신 의도를 보자