концепция
Прокси -режим: прокси -режим на самом деле является дополнительным классом прокси для выполнения некоторых операций на исходном объекте. Например, иногда нам нужно нанять адвоката, когда мы идем к иску, потому что адвокаты имеют опыт в области права и могут управлять и выражать наши идеи для нас. Это то, что означает агентство. Прокси -режим разделен на две категории: 1. Статический прокси (не используя методы в JDK); 2. Динамический прокси (с использованием vocationhandler и прокси в JDK).
Статический прокси создается программистами или инструментами для генерации исходного кода класса прокси, а затем компилировать класс прокси. Так называемый статический означает, что файл ByteCode класса прокси уже существует перед запуском программы, а отношения между классом прокси и классом делегатов определяются перед запуском.
Исходный код класса динамического прокси -сервера динамически генерируется JVM в соответствии с отражением и другими механизмами во время работы программы, поэтому нет файла Bytecode класса прокси. Связь между классом прокси и классом делегатов определяется при запуске программы.
Пример
Здесь мы приводим пример статического прокси:
Классовая диаграмма:
/ *** Интерфейс Gamer**/ public interface Igameplayer {// Войти в игру Public void Void (String User, String Password); // Убить монстров, главная особенность онлайн -игр public void killboss (); // Обновление публичного обновления void (); } / *** Геймер**/ public Class Gameplayer реализует igameplayer {private String name = ""; // пройти имя через конструктор Public Gameplayer (String _Name) {this.name = _name; } // При борьбе с монстрами наиболее ожидаемым является убить старого монстра public void killboss () {System.out.println (this.name + "Убийся монстров!"); } // Вы должны войти в систему перед входом в игру. Это необходимое условие. public void login (String user, String password) {System.out.println («Имя входа в систему" + user + "Роль" + this.name + "Вход успешно!"); } // Обновление, есть много способов обновления, тратить деньги на покупку, и выполнение задач также является своего рода публичным обновлением void () {System.out.println (this.name + «Другой уровень!»); }} /*** Клиент не виден для прокси -объекта*/Public Class GameplayerProxy реализует igameplayer {private igameplayer Gameplayer = null; // Proxy Object // Проходит через конструктор, которому можно практиковать public gameplayerproxy (string onsame) {this.gameplayer = gameplayer (string onsame) {this.gameplayer =; } // получатель убийства монстров public void killboss () {this.gameplayer.killboss (); } // получатель для входа в систему void login (String user, String password) {this.gameplayer.login (пользователь, пароль); } // Практика обновления public void upgrade () {this.gameplayer.upgrade (); }} /** Клиент не виден для прокси -объекта*/public Class GameplayerProxy2 реализует igameplayer {private igameplayer Gameplayer = null; // Proxy Object // Проходит через конструктор, чтобы практиковать public gameplayerproxy2 (string oname) {this.gameplayer = newmeplayer (us uname) {this.gameplayer = newmeplayer); } // Получатель убийства монстров 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 ()); }} /** Клиент не виден для Proxy объекта*/ public Class GameplayerProxy3 {Private Igameplayer Gameplayer; // Передайте объект Proxy (Proxy) через конструктор Public GameplayerProxy3 (Igameplayer Gameplayer) {this.gameplayer = Gameplayer; System.out.println («Я - прокси, персонаж, которого я играю, - это чужой, и его можно динамически передано»); } public igameplayer getProxy () {return (igameplayer) proxy.newproxyinstance (this.getClass (). getClassLoader (), новый класс [] {igamePlayer.class}, новый myInvocationHhiphorhler ()); } Частный класс MyInvocationHandler реализует vocationHandler {@Override public Object vupublic vuctive (Proxy Object, метод метода, Object [] args) бросает Throwable {if (method.getName (). equals ("login")) {System.out.println ("localesting ()"); } if (method.getName (). equals ("urdgrade")) {system.out.println ("Время обновления:" + new Date (). Tolocalestring ()); } method.invoke (геймплейер, args); вернуть ноль; }}} открытый тест класса {public static void main (string [] args) { /** Нормальный статический прокси: клиент не знает объекта прокси, а объект прокси завершает свою функцию Call* / 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 (); /** Прокси -объект усиливает функцию объекта Proxy*/ igameplayer proxy2 = new GameplayerProxy2 ("M"); proxy2.login ("lisi", "efg"); proxy2.killboss (); proxy2.upgrade (); System.out.println (); /** Dynamic Proxy: используйте vocationHandler, предоставленный JDK, чтобы отразить метод вызова прокси-объекта* в сочетании с Java.Reflect.Proxy для генерации прокси-объектов* Динамически входить в объект прокси, чтобы построить vlockhandler, а функции прокси-объекта могут быть улучшены, когда приводятся в положении), что поведение (поведение), что поведение), что поведение), что поведение), что поведение), что поведение), что поведение), которое будет выполнено, что поведение), что поведение), которое вызывает поведение). (уведомление) * В GamePlayerProxy3 это время начала уведомления, когда метод называется Login, и время окончания уведомлений, когда обновление */ GamePlayerProxy3 Dynamic = New GamePlayerProxy3 (новый Gameplayer («y»)); Igameplayer dynamicPlayer = dynamic.getProxy (); DynamicPlayer.Login ("wangwu", "1234"); DynamicPlayer.killboss (); DynamicPlayer.upgrade (); /** РЕДАКТИРОВАТЬ, Ориентированная: какая-то аналогичная бизнес-логика должна быть добавлена во многие места, поэтому мы можем извлечь ее в раздел, который является разделом транзакций: например, раздел журнала, раздел разрешений, бизнес-раздел*/}} Печать:
Время начала: 2014-10-8 17:19:05 Роль входа X с Чжангсаном успешно вошел в систему! X борется с монстрами! X был обновлен до другого уровня! Время окончания: 2014-10-8 17:19:05 Время входа в систему: 2014-10-8 17:19:05 Роль входа в вход M с именем LISI успешно вошел! М боится монстров! М был обновлен до другого уровня! Время обновления: 2014-10-8 17:19:05 Я прокси-игрок. Персонаж, в котором я играю,-это чужое, и я могу динамически передать его, чтобы войти в систему. Время: 2014-10-8 17:19:05. Персонаж в логин Y с именем Wangwu был успешно вошел! Y борется с монстрами! Время обновления: 2014-10-8 17:19:05 Y был обновлен до другого уровня!
преимущество
(1) Роль четких обязанностей состоит в том, чтобы реализовать реальную бизнес-логику, и вам не нужно заботиться о других не отвечаемых делах. Вы можете завершить транзакцию через более поздний агент. Сопровождающий результат - краткое и четкое программирование.
(2) Прокси -объект может действовать как посредник между клиентом и целевым объектом, который играет роль и защищает целевой объект.
(3) Высокая масштабируемость