독서 노트 (18)

제1 8 장 대리 모델
대리 모델 은 위탁 모델 이 라 고도 부 르 는데 구조 형 디자인 모델 중의 하나 이다.광범 위 하 게 응용 되 는 모델 중의 하나 다.
1. 정의
이 대상 에 대한 접근 을 제어 하기 위해 다른 대상 에 게 에이 전 트 를 제공 합 니 다.
2. 필드 사용
특정한 대상 을 직접 방문 할 수 없 거나 방문 하기 어 려 울 때 하나의 대리 대상 을 통 해 간접 적 으로 방문 할 수 있 습 니 다. 클 라 이언 트 가 사용 하 는 투명 성 을 확보 하기 위해 의뢰 대상 과 대리 대상 은 같은 인 터 페 이 스 를 실현 해 야 합 니 다.
3. UML 도표
(1) Subject: 추상 적 인 주제 류, 진실 한 주제 와 공동 인터페이스 방법 을 설명 합 니 다. 이 종 류 는 추상 적 인 유형 이나 인터페이스 일 수 있 습 니 다.
(2) RealSubject: 실제 주제 류 (피 위탁 류), 특히 구체 적 인 업무 논리 방법 을 집행 한다.
(3) Proxy: 프 록 시 클래스 (의뢰 클래스) 는 실제 주제 류 에 대한 인용 을 가지 고 실 현 된 인터페이스 방법 에서 실제 주제 류 에 해당 하 는 인터페이스 방법 을 호출 하여 프 록 시 역할 을 합 니 다.
4. 단순 실현
책의 예: 소민 소송의 절차 로 예 를 들 자.그러면 변호사 대리 가 필요 합 니 다. 소송 간단 한 절차: 신청 제출 – > 거증 진행 – > 변호 시작 – > 소송 완료.
소송 인터페이스 클래스:
public interface ILawsuit {

    /** *      */
    void submit();

    /** *      */
    void burden();

    /** *      */
    void defend();

    /** *      */
    void finish();
}

구체 적 인 소송인 샤 오 민:
public class XiaoMin implements ILawsuit{

    @Override
    public void submit() {
        //      
        System.out.println("        ,      !");
    }

    @Override
    public void burden() {
        //      
        System.out.println("                 !");
    }

    @Override
    public void defend() {
        //    
        System.out.println("    ,       !");
    }

    @Override
    public void finish() {
        //  
        System.out.println("    ,              !");
    }

}

대리 변호사:
public class Lawyer implements ILawsuit{

    private ILawsuit mLawsuit; //             

    public Lawyer(ILawsuit lawsuit) {
        this.mLawsuit = lawsuit;
    }

    @Override
    public void submit() {
        mLawsuit.submit();
    }

    @Override
    public void burden() {
        mLawsuit.burden();
    }

    @Override
    public void defend() {
        mLawsuit.defend();
    }

    @Override
    public void finish() {
        mLawsuit.finish();
    }

}

중재 시작:
public class Client {
    public static void main(String[] args) {
        //        
        ILawsuit xiaomin = new XiaoMin();

        //        ,        
        ILawsuit lawyer = new Lawyer(xiaomin);

        //      
        lawyer.submit();

        //      
        lawyer.burden();

        //       
        lawyer.defend();

        //    
        lawyer.finish();
    }
}

결과:
        ,      !
                 !
    ,       !
    ,              !

마찬가지 로 우 리 는 다른 사람 을 대리 할 수 있 으 며, ILawsuit 만 실현 하면 된다.위의 프 록 시 모드 는 정적 프 록 시 라 고도 합 니 다. 즉, 코드 가 실행 되 기 전에 프 록 시 클래스 의 class 파일 이 이미 존재 합 니 다.그러면 반대로 동적 대리 도 있 습 니 다. 다음은 동적 대리 로 상기 예 를 들 어 보 겠 습 니 다.
자바 는 편리 한 동적 프 록 시 인터페이스 Invocation Handler 를 제공 합 니 다. 우 리 는 그것 을 실현 합 니 다.
public class DynamicPorxy implements InvocationHandler{

    private Object obj; //       

    public DynamicPorxy(Object obj) {
        this.obj = obj;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {
        //            
        Object result = method.invoke(obj, args);
        return result;
    }

}

여기 서 우 리 는 invoke 방법 을 통 해 구체 적 인 피 대리 방법 을 호출 합 니 다.
수 정 된 클 라 이언 트 클래스:
public class Client {
    public static void main(String[] args) {
        //        
        ILawsuit xiaomin = new XiaoMin();

        //1.    
        //        ,        
        //ILawsuit lawyer = new Lawyer(xiaomin);

        //--------------------------------------
        //2.    
        //        
        DynamicPorxy proxy = new DynamicPorxy(xiaomin);

        //         ClassLoader
        ClassLoader loader = xiaomin.getClass().getClassLoader();

        //           
        ILawsuit lawyer = (ILawsuit) Proxy.newProxyInstance(loader, new Class[]{ ILawsuit.class }, proxy);

        //      
        lawyer.submit();

        //      
        lawyer.burden();

        //       
        lawyer.defend();

        //    
        lawyer.finish();
    }
}

결 과 는 변 하지 않 습 니 다. 이 를 통 해 알 수 있 듯 이 동적 대 리 는 하나의 대리 류 를 통 해 N 여러 개의 피 대리 류 를 처리 하 는데 실질 적 으로 대리자 와 피 대리자 에 대한 결합 입 니 다.상대 적 으로 정적 대 리 는 주어진 인터페이스 에서 의 실현 류 만 대리 할 수 있 습 니 다. 인터페이스 가 다 르 면 서로 다른 대리 류 를 다시 정의 해 야 합 니 다. 복잡 하지만 정적 대 리 는 대상 을 대상 으로 하 는 원칙 에 더욱 부합 합 니 다.구체 적 으로 어떤 방식 을 사용 하 는 지 는 취향 에 따라.
5. Android 소스 코드 의 프 록 시 모드 구현
1. Activity Manager 프 록 시 에이전트 클래스
Activity Manager 는 Android 에서 Activity 와 관련 된 정 보 를 관리 하고 유지 하 는 클래스 입 니 다. Activity Manager Service 와 격 리 되 어 이들 의 결합 을 효과적으로 낮 추기 위해 이 중간 에 Activity Manager Proxy 프 록 시 클래스 를 사 용 했 습 니 다. 모든 Activity Manager Service 에 대한 방문 은 프 록 시 클래스 에 대한 방문 으로 전환 되 었 습 니 다. 그러면 Activity Manager 는 Activity Manager Service 와 결합 을 해제 합 니 다.
6. 총화
1. 장점
(1) 대리자 와 피 대리자 의 결합 을 해제 한다.
(2) 대리 대상 은 클 라 이언 트 와 목표 대상 사이 에 중개 역할 을 하면 목표 대상 에 대한 보 호 를 할 수 있다.
2. 단점
기본적으로 결점 이 없다. 정말 단점 은 디자인 모델 의 통폐 이다. 유형 에 대한 증가 이다.

좋은 웹페이지 즐겨찾기