Java 레코드-90 - 정적 프록시 모드 심도 분석
프록시 모드의 역할은 다른 대상에게 프록시를 제공하여 이 대상에 대한 접근을 제어하는 것이다.
어떤 상황에서 한 고객이 다른 대상을 원하지 않거나 직접 인용할 수 없으며 대리지하는 클라이언트와 목표 대상 사이에 중개 역할을 할 수 있다.
프록시 모델은 일반적으로 세 가지 역할과 관련된다.
1. 추상적인 역할: 실제 대상과 대리 대상의 공동 인터페이스를 성명한다.
2. 프록시 역할: 프록시 대상 역할 내부에 실제 대상에 대한 인용이 포함되어 있어 실제 대상을 조작할 수 있다. 또한 프록시 대상은 실제 대상과 같은 인터페이스를 제공하여 언제든지 실제 대상을 대체할 수 있도록 한다.또한 대리 대상은 실제 대상 조작을 수행할 때 다른 조작을 추가할 수 있어 실제 대상을 봉인하는 것과 같다.
3. 실제 역할: 대리 역할이 대표하는 실제 대상은 우리가 최종적으로 인용할 대상이다.
정적 프록시 모드의 코드 구현:
public abstract class Subject {
public abstract void request();
}
public class RealSubject extends Subject{
@Override
public void request() {
System.out.println("from real subject");
}
}
public class ProxySubject extends Subject{
private RealSubject realSubject; //
@Override
public void request() {
preRequest(); //
if(null == realSubject){
realSubject = new RealSubject();
}
realSubject.request(); //
postRequest(); //
}
private void preRequest(){
System.out.println("pre request");
}
private void postRequest(){
System.out.println("post request");
}
}
public class Client {
public static void main(String[] args){
Subject subject = new ProxySubject();
subject.request();
}
}
위 코드를 통해 알 수 있듯이 고객이 실제적으로 필요로 하는 것은 RealSubject 클래스의 Request () 방법입니다. 현재는 ProxySubject로 RealSubject 클래스를 대리하고 같은 목적을 달성하는 동시에 다른 방법(preRequest (),postRequest () 을 봉하여 다른 문제를 처리할 수 있습니다.
상술한 방법에 따라 에이전트 모델을 사용하려면 실제 역할은 사전에 존재하고 이를 에이전트 대상의 내부 속성으로 해야 한다.그러나 실제적으로 사용할 때 하나의 실제 역할은 반드시 하나의 대리 역할에 대응해야 한다. 만약에 대량으로 사용하면 유형의 급격한 팽창을 초래할 수 있다.그리고 실제 캐릭터를 미리 모르면 대리인을 어떻게 사용해야 하나요?이 문제는 자바의 동적 프록시 클래스를 통해 해결할 수 있습니다.