독서 노트 (18)
대리 모델 은 위탁 모델 이 라 고도 부 르 는데 구조 형 디자인 모델 중의 하나 이다.광범 위 하 게 응용 되 는 모델 중의 하나 다.
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. 단점
기본적으로 결점 이 없다. 정말 단점 은 디자인 모델 의 통폐 이다. 유형 에 대한 증가 이다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
디자인 모델 의 공장 모델, 단일 모델자바 는 23 가지 디자인 모델 (프로 그래 밍 사상/프로 그래 밍 방식) 이 있 습 니 다. 공장 모드 하나의 공장 류 를 만들어 같은 인 터 페 이 스 를 실현 한 일부 종 류 를 인 스 턴 스 로 만 드 는 것...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.