특정 객체로의 접근을 제어하는 대리인을 제공한다.
원격 객체로의 접근을 제어
다른 JVM에 들어있는 객체의 대리인에 해당하는 로컬 객체. 프록시의 메소드를 호출하면 그 호출이 네트워크로 전달되어 결국 원격 객체의 메소드가 호출된다. 그리고 그 결과는 다시 프록시를 거쳐서 클라이언트에게 전달된다.
- RMI(Remote Method Invocation, 원격 메소드 호출)을 사용
- 클라이언트 보조 객체(스텁)와 서비스 보조 객체(스켈레톤)를 만든다.
- 클라이언트에서 원격 객체를 찾아 접근하기 위해 쓸 수 있는 룩업 서비스도 제공한다.
- 클라이언트 입장에서는 로컬 메소드 호출과 같은 방식으로 메소드를 호출하지만, 실제로 클라이언트 보조객체에서 네트워크를 통해 호출을 전송할 수 있다.
- 네트워킹 및 입출력 기능이 필수적이며, 이에 대한 주의가 필요하다.
생성하기 힘든 자원으로의 접근을 제어
생성하는 데 많은 비용이드는 객체를 대신한다. 진짜 객체가 필요한 상황이 오기 전까지 객체의 생성을 미루는 기능을 제공한다. 객체 생성전이나 객체 생성 도중에 객체를 대신하기도 하고, 객체 생성이 끝나면 RealSubject에 직접 요청을 전달한다.
접근 권한이 필요한 자원으로의 접근을 제어
java.lang.reflect 패키지 안에 프록시 기능이 내장되어 있다. 이 패키지를 사용하면 즉석에서 하나 이상의 인터페이스를 구현하고, 지정한 클래스에 메소드 호출을 전달하는 프록시 클래스를 만들 수 있다. 진짜 프록시는 실행 중에 생성되므로 이러한 자바 기술을 동적 프록시(dynamic proxy)라고 부른다.