JAVA 디자인 모드의 [에이전트 모드] 1(정적 에이전트)

프록시 모드


프록시 모델은 대상의 구조 모델로 한 대상에게 프록시 대상을 제공하고 프록시 대상이 원래 대상에 대한 인용을 제어한다.우리는 조작 대리 대상을 통해 원 대상에 대한 호출을 실현할 수 있다.
본고는 정적 에이전트, jdk 동적 에이전트, cglib 동적 에이전트 세 가지를 다루고 있다.

대리의 종류


- 원격(Remote) 에이전트: 서로 다른 주소 공간에 있는 대상에게 국역 대표 대상을 제공합니다.이 서로 다른 공간 주소는 본 기계에 있을 수도 있고 다른 기계에 있을 수도 있다.
- 가상 에이전트: 필요에 따라 자원 소모가 비교적 큰 대상을 만들어서 이 대상이 진정으로 필요할 때 만들어진다.
- Copy-on-Write 에이전트: 가상 에이전트의 일종으로 복제를 클라이언트가 필요할 때만 진정으로 행동을 취할 수 있도록 지연시킨다.
- 보호 에이전트: 하나의 대상에 대한 접근을 제어하고 필요하면 서로 다른 사용자에게 서로 다른 수준의 사용 권한을 부여할 수 있다.
- Cache 에이전트: 여러 클라이언트가 결과를 공유할 수 있도록 한 대상 작업의 결과에 임시 저장 공간을 제공합니다.
- 방화벽 에이전트: 악성 사용자가 접근하지 않도록 목표를 보호합니다.
- 동기화 에이전트: 충돌하지 않고 여러 사용자가 한 객체를 동시에 사용할 수 있도록 합니다.
- 스마트 인용 에이전트: 대상이 인용될 때 대상의 호출 횟수를 기록하는 등 추가 조작을 제공한다.

대리 모델의 구조(사상)


프록시 모드에 포함된 역할은 다음과 같습니다.
- 추상적 주제 역할 - 실제 주제 역할 - 프록시 주제 역할
1. 추상적인 주제 역할은 실제 주제와 대리 주제 간의 공통된 인터페이스를 설명한다. 대리 주제는 추상적인 주제와 같은 방법, 속성을 가지고 있기 때문에 실제 주제만 사용할 수 있는 모든 곳에서 대리 주제만 사용할 수 있다.
/**
 *     
 * @author wuqiong
 *
 */
public abstract class Subject {
    public abstract void request();
}

2. 실제 주제 역할은 실제 대상을 정의했다. 즉, 우리가 대리 대상이 조작하도록 하는 실제 대상은 추상적인 인터페이스를 실현했다.
/**
 *     
 * @author wuqiong
 *
 */
public class RealSubject extends Subject {

    @Override
    public void request() {
        System.out.println("    request    ");
    }
}

3. 프록시 주제 역할 프록시 주제 역할 역시 추상적인 유형을 실현하고 내부에 실제 주제에 대한 인용을 포함하여 언제든지 실제 주제 대상을 조작할 수 있다.프록시 역할은 클라이언트가 실제 테마를 호출하기 전이나 그 다음에 특정한 조작을 실행하는 것이지 단독으로 실제 역할에 호출을 전달하는 것이 아니다.
/**
 *       
 * @author wuqiong
 *
 */
public class ProxySubject extends Subject {

    private RealSubject realSubject = new RealSubject();

    @Override
    public void request() {
        preRequest();
        realSubject.request();
        afterRequest();
    }

    public void preRequest() {
        System.out.println("request        ");
    }

    public void afterRequest() {
        System.out.println("request        ");
    }

}

테스트 실행 결과:
public class ProxyTest {

    public static void main(String[] args) {
        ProxySubject ps = new ProxySubject();
        ps.request();
    }
}

인쇄 결과
request        
    request    
request        

위의 프록시 테마 유형의 코드를 통해 프록시 모델이 어떻게 작동하는지 알 수 있다. 우선, 프록시 모델은 테마의 인터페이스를 바꾸지 않는다. 왜냐하면 모델의 의도는 클라이언트에게 프록시의 존재를 느끼게 하는 것이 아니기 때문이다.그 다음에 대리인은 위임을 사용하여 클라이언트의 호출을 실제 주제 대상에게 위임하고 대리 주제는 그 중에서 전달 요청의 정도를 한다.마지막으로 프록시 테마는 요청을 전달하기 전과 후에 특정한 코드를 실행할 수 있으며 단순한 요청을 수행하는 것이 아니다.

프록시 모드 시퀀스


클라이언트가 프록시 테마에 요청을 할 때 프록시 테마는 요청한 동료에게 preRequest () 작업을 한 다음에 요청을 실제 테마에 전달합니다.실제 테마가 실행된 후에 애프터 Request () 방법을 실행해야만 클라이언트에게 제어를 되돌려줍니다.간단하게 말하면 에이전트 모델은 클라이언트와 테마 역할 사이에 중간층을 삽입하여 많은 유연성을 제공했다.
동적 에이전트 보기: JAVA 디자인 모델의 [에이전트 모드] 1(jdk 동적 에이전트)http://blog.csdn.net/emma_joans/article/details/78594185

좋은 웹페이지 즐겨찾기