개념
프록시 모드 : 프록시 모드는 실제로 원래 객체에서 일부 작업을 수행하기위한 추가 프록시 클래스입니다. 예를 들어, 변호사는 법에 대한 전문 지식을 가지고 있으며 우리를 위해 우리의 아이디어를 운영하고 표현할 수 있기 때문에 소송에 갈 때 변호사를 고용해야합니다. 이것이 기관의 의미입니다. 프록시 모드는 두 가지 범주로 나뉩니다. 1. 정적 프록시 (JDK의 메소드를 사용하지 않음); 2. 동적 프록시 (JDK의 invocationHandler 및 프록시 사용).
정적 프록시는 프로그래머 또는 도구에 의해 프록시 클래스의 소스 코드를 생성 한 다음 프록시 클래스를 컴파일합니다. 소위 정적은 프로그램이 실행되기 전에 프록시 클래스의 바이트 코드 파일이 이미 존재하며 프록시 클래스와 대의원 클래스 간의 관계는 실행하기 전에 결정됩니다.
동적 프록시 클래스의 소스 코드는 프로그램 작동 중 반사 및 기타 메커니즘에 따라 JVM에 의해 동적으로 생성되므로 프록시 클래스의 바이트 코드 파일이 없습니다. 프록시 클래스와 대의원 클래스 간의 관계는 프로그램이 실행되는시기에 결정됩니다.
예
여기서 우리는 정적 프록시의 예를 제공합니다.
클래스 다이어그램 :
/ *** 게이머 인터페이스**/ public interface igameplayer {// 게임에 로그인 public void login (문자열 사용자, 문자열 암호); // Online Games의 주요 특징 인 Public void KillBoss (); // 업그레이드 public void upgrade (); } / *** 게이머**/ 공개 클래스 게임 플레이어는 igameplayer {private String name = ""; // 생성자 공개 게임 플레이어 (String _name) {this.name = _name; } // 몬스터와 싸울 때 가장 기대되는 것은 오래된 괴물을 죽이는 것입니다. public void killboss () {system.out.println (this.name + "kill monsters!"); } // 게임에 들어가기 전에 로그인해야합니다. 이것은 필요한 조건입니다. public void login (문자열 사용자, 문자열 비밀번호) {System.out.println ( "로그인 이름은" + user + "role" + this.name + "로그인이 성공적으로!"); } // 업그레이드, 업그레이드, 구매에 돈을 쓰는 방법에는 여러 가지가 있으며 작업을 수행하는 작업은 일종의 공개 무효 업그레이드 () {System.out.println (this.name + "다른 레벨!")입니다. }} /*** 클라이언트는 프록시 객체에 보이지 않습니다*/public 클래스 게임 플레이어 프록시는 igameplayer {private igameplayer gameplayer = null; // 프록시 객체 // 공개 게임 플레이어를 연습하기 위해 생성자를 통과합니다 (this.gameplayer = new GamePlayer); } // 몬스터를 죽이는 수신자 public void killboss () {this.gameplayer.killboss (); } // 수신자 로그인 공개 void login (문자열 사용자, 문자열 비밀번호) {this.gameplayer.login (사용자, 암호); } // 업그레이드 연습 공개 void 업그레이드 () {this.gameplayer.upgrade (); }} /** 클라이언트는 프록시 개체에 보이지 않습니다*/public class GamePlayerProxy2는 igameplayer {private igameplayer gameplayer = null; // proxy 객체 // 공개 게임 플레이어를 연습하기 위해 생성자를 통과합니다. } // 수신자 Kill Monsters public void killboss () {this.gameplayer.killboss (); } // 수신자 로그인 public void login (string user, string password) {System.out.println ( "localEstring ()"); this.gameplayer.login (사용자, 암호); } // 연습 업그레이드 () public void upgrade () {this.gameplayer.upgrade (); System.out.println ( "업그레이드 시간은" + new date (). tolocalestring ()); }} /** 클라이언트는 프록시 객체에 보이지 않습니다*/ public class GamePlayerProxy3 {private igameplayer 게임 플레이어; // 생성자 public GamePlayerProxy3 (IgamePlayer GamePlayer)을 통해 프록시 (프록시) 객체를 전달합니다. {this.gameplayer = 게임 플레이어; System.out.println ( "나는 대리입니다. 내가하는 캐릭터는 다른 사람이며 동적으로 통과 할 수 있습니다"); } public igameplayer getProxy () {return (itameplayer) proxy.newproxyInstance (this.getClass (). getClassLoader (), new Class [] {igameplayer.class}, new myInvocationHandler ()); } private class myInvocationHandler는 invocationHandler를 구현합니다 {@Override public Object invoke (오브젝트 프록시, 메소드 메소드, 오브젝트 [] args) 던지기 가능 {if (method.getName (). equals ( "login")) {system.out.println ( "localestring ()"; } if (method.getName (). equals ( "upgrade")) {System.out.println ( "업그레이드 시간은" + new date (). tolocalestring ()); } method.invoke (게임 플레이어, Args); 널 리턴; }}} public class test {public static void main (String [] args) { /** 일반 정적 프록시 : 클라이언트는 프록시 객체를 알지 못하고 프록시 객체가 함수 호출을 완료합니다* / igameplayer proxy = new GamePlayerProxy ( "x"); System.out.println ( "시작 시간은 :" + new date (). tolocalestring ()); proxy.login ( "zhangsan", "abcd"); proxy.killboss (); proxy.upgrade (); System.out.println ( "종료 시간은" + new date (). tolocalestring ()); System.out.println (); /** 프록시 객체는 프록시 객체의 기능을 향상시킵니다*/ igameplayer proxy2 = 새로운 게임 플레이어 프록시 2 ( "m"); proxy2.login ( "lisi", "efg"); proxy2.killboss (); proxy2.upgrade (); System.out.println (); /** Dynamic Proxy : JDK가 제공 한 invociation hange을 사용하여 프록시 객체를 호출하는 방법을 반영하여 프록시 객체를 생성하기 위해 프록시 객체를 생성합니다* 프록시 객체를 동적으로 입력하여 호출 핸들러를 구성 할 때 프록시 객체를 구축 할 때, (handler* 또는 다른 단어) (:) 수행 (알림) * GamePlayerProxy3에서 메소드가 로그인이라고 할 때 알림 시작 시간과 업그레이드 */ GamePlayerProxy3 Dynamic = New GamePlayerProxy3 (새 게임 플레이어 ( "Y"))의 알림 종료 시간; igameplayer dynamicplayer = dynamic.getProxy (); Dynamicplayer.login ( "Wangwu", "1234"); Dynamicplayer.killboss (); DynamicPlayer.upgrade (); /** 편집 지향 : 여러 장소에 유사한 비즈니스 논리를 추가해야하므로 트랜잭션 섹션과 같은 섹션으로 추출 할 수 있습니다. 로그 섹션, 권한 섹션, 비즈니스 섹션*/}} 인쇄:
시작 시간은 다음과 같습니다. 2014-10-8 17:19:05 Zhangsan과 함께 로그인 역할 X가 성공적으로 로그인되었습니다! X는 괴물과 싸우고 있습니다! X는 다른 레벨로 업그레이드되었습니다! 종료 시간은 다음과 같습니다. 2014-10-8 17:19:05 로그인 시간은 : 2014-10-8 17:19:05 LISI라는 이름의 로그인 역할 M이 성공적으로 로그인되었습니다! M은 괴물과 싸우고있다! M은 다른 수준으로 업그레이드되었습니다! 업그레이드 시간은 : 2014-10-8 17:19:05 프록시 플레이어입니다. 내가 플레이하는 캐릭터는 다른 사람의 사람이며, 동적으로 통과하여 로그인 할 수 있습니다. 시간은 : 2014-10-8 17:19:05 Wangwu라는 이름의 로그인 문자 Y가 성공적으로 로그인되었습니다! Y는 괴물과 싸우고 있습니다! 업그레이드 시간은 다음과 같습니다. 2014-10-8 17:19:05 Y는 다른 레벨로 업그레이드되었습니다!
이점
(1) 명확한 책임의 역할은 실제 비즈니스 논리를 실현하는 것이며, 다른 책임없는 업무에 대해 신경 쓰지 않아도됩니다. 나중에 에이전트를 통해 거래를 완료 할 수 있습니다. 동반 결과는 간결하고 명확한 프로그래밍입니다.
(2) 프록시 객체는 클라이언트와 대상 객체 사이의 중개자 역할을 할 수 있으며, 이는 역할을 수행하고 대상 객체를 보호합니다.
(3) 높은 확장 성