정의:
다른 개체에 대한 대리 또는 자리 표시자를 제공하여 액세스를 제어하십시오.
다른 개체 가이 객체에 대한 액세스를 제어하기위한 프록시.
일반적인 설명 :
일반적으로 초록 테마, 콘크리트 테마 및 에이전트 테마의 세 가지 역할이 포함되어 있습니다.
일반 클래스 다이어그램 :
일반 코드 :
패키지 프록시; // 초록 주제 클래스 : 공개 인터페이스 주제 {public void dosomething ();} 패키지 프록시; // 특정 주제 클래스 공개 클래스 realsubject 구현 주제 {@override public void dosomething () {system.out.println ( "Business Logic ..."); }} 패키지 프록시; // 프록시 주제 클래스 프록시는 주제 {private sub = null; @override public void dosomething () {this.sub.dosomething (); } public proxy (주제 서브) {this.sub = sub; }} 패키지 프록시; // 클라이언트 공개 클라이언트 클라이언트 {public static void main (string [] args) {subject realsub = new RealSubject (); 주제 프록시 = 새로운 프록시 (RealSub); proxy.dosomething (); }}이점 :
1. 명확한 책임
2. 높은 확장
프록시 모드의 확장 :
일반 요원 :
특정 테마 클래스는 높은 수준의 레벨에 투명하며 특정 테마 클래스는 프록시 테마 클래스에서 구성됩니다.
코드 구현 :
패키지 GeneralProxy; 공개 인터페이스 주제 {public void dosomething ();} 패키지 GeneralProxy; 공개 클래스 realsubject 구현 주제 {private String name = null; @override public void dosomething () {system.out.println (this.name + "프록시, 비즈니스 로직 실행 ..."); } public realSubject (주제 프록시, 문자열 이름)는 예외를 던져 {if (proxy == null) {새 예외 ( "프록시 개체를 생성 할 수 없음"); } else {this.name = 이름; }}} 패키지 GeneralProxy; 공개 클래스 프록시는 주제를 구현합니다 {개인 주제 realsub = null; public proxy (문자열 이름) {try {realsub = new RealSubject (this, name); } catch (예외 e) {e.printstacktrace (); }} public void dosomething () {realsub.dosomething (); }} 패키지 GeneralProxy; Public Class Client {public static void main (String [] args) {// 일반 프록시 주제 proxy = new Proxy ( "Zhang San"); proxy.dosomethaing (); }}
강제 프록시 :
특정 주제 클래스에 액세스하여 프록시 주제 클래스의 객체를 얻은 다음 프록시 주제 클래스를 사용하여 액세스를 제어해야합니다.
코드 구현 :
패키지 필수 장난 프록시; 공개 인터페이스 주제 {public void dosomething (); 공개 주제 getProxy ();} 패키지 필수 장애물; 공개 클래스 realsubject 구현 주제 {private String name = null; 개인 주제 프록시 = null; @override public void dosomething () {if (isproxy ()) {system.out.println (this.name + "프록시, 비즈니스 로직 실행 ..."); } else {System.out.println ( "프록시에 먼저 액세스하십시오 ..."); }} public realSubject (문자열 이름) {this.name = 이름; } 공개 주제 getProxy () {proxy = new Proxy (this); 이것을 반환하십시오. Proxy; } private boolean isproxy () {if (this.proxy == null) {return false; } else {return true; }}} 패키지 필수 장난 꾸러기; 공개 클래스 프록시는 주제를 구현합니다 {개인 주제 realsub = null; public proxy (주제 realsub) {this.realsub = realsub; } public void dosomething () {this.realsub.dosomething (); } 공개 주제 getProxy () {return this; }} 패키지 필수 프로그램; Public Class Client {public static void main (String [] args) {subject realsub = new RealSubject ( "Zhang San"); RealSub.dosomething (); 대상 프록시 = RealSub.getProxy (); proxy.dosomething (); }} 응용 프로그램 시나리오
현실 세계에서 비서는 대리인과 동일합니다. 상사가 회의를 개최 한 다음 직원들에게 회의 시간을 알리고 회의를 마치고 회의 후 회장을 정리하는 등의 회의 등을 비서에게 넘겨 줄 수 있습니다. 상사는 회의를 개최하면되며 직접 그런 일을 할 필요는 없습니다. 마찬가지로 프로그래밍에서 프록시 패턴을 사용하여 비즈니스 코드의 로그 코드가 프록시에서 수행 될 수있는 일련의 관련없는 논리와 결합 된 코드를 분리 할 수도 있습니다. Spring 's AOP는 일반적인 동적 프록시 응용 프로그램입니다.
프록시 모드의 신청서
(1) 원격 프록시 - 객체가 다른 주소 공간에 존재한다는 사실을 숨길 수 있습니다. 또한 클라이언트가 원격 기계에서 객체에 액세스 할 수 있습니다. 원격 기계는 컴퓨팅 성능 및 처리 속도가 향상 될 수 있으며 클라이언트 요청을 신속하게 응답하고 처리 할 수 있습니다.
(2) 가상 프록시를 사용하면 필요한 경우 메모리 오버 헤드가 높은 객체를 생성 할 수 있습니다. 이 객체가 실제로 필요할 때만 만듭니다.
(3) Copy-on-Write 프록시는 고객이 실제로 필요할 때까지 물체의 복사를 지연시켜 물체의 복사를 제어하는 데 사용됩니다. 가상 프록시의 변형입니다.
(4) 보호 (액세스) 프록시)는 다양한 고객에게 다양한 수준의 대상 객체 액세스 권한을 제공합니다.
(5) 캐시 프록시는 오버 헤드 계산 결과를위한 임시 스토리지를 제공합니다. 여러 고객이 결과를 공유하여 계산 또는 네트워크 대기 시간을 줄일 수 있습니다.
(6) 방화벽 프록시는 네트워크 리소스에 대한 액세스를 제어하고 악의적 인 고객으로부터 주제를 보호합니다.
(7) SynchronizationProxy는 멀티 스레딩의 경우 주제에 대한 안전한 액세스를 제공합니다.
(8) 스마트 참조 프록시 - 객체가 참조되면이 객체에 대한 통화 수를 기록하는 등의 추가 작업을 제공합니다.
(9) 복잡성 숨기기 프록시는 복잡한 클래스 컬렉션의 복잡성을 숨기고 액세스 제어를 수행하는 데 사용됩니다. 때로는 파사드 프록시라고도합니다. 이해하기 어렵지 않습니다. 프록시가 액세스를 제어하기 때문에 복잡한 숨겨진 프록시 및 모양 모드는 다르지만 프록시는 액세스를 제어하기 때문에 모양 모드는 다르고 모양 모드는 다른 인터페이스 세트 만 제공합니다.