1. Режим агента
Агент — это лицо или учреждение, действующее от имени другого лица или учреждения. В некоторых случаях клиент не хочет или не может напрямую ссылаться на объект, и прокси-объект может выступать в качестве посредника между клиентом и целевым объектом.
Шаблон прокси предоставляет прокси-объект для объекта, а прокси-объект управляет ссылкой на исходный объект.
Пример из реальной жизни: в Новый год вы заняты сверхурочно и у вас нет времени покупать билеты на поезд. В это время вы можете позвонить в ближайший билетный центр и попросить купить вам билет на поезд домой. добавьте дополнительную оплату труда. Но должно быть ясно, что билетный центр сам по себе не продает билеты. Билеты, которые билетный центр продает вам, фактически реализуются через железнодорожный вокзал. Это очень важно!
В приведенном выше примере вы являетесь «клиентом», билетный центр — «роль агента», железнодорожный вокзал — «реальной ролью», а продажа билетов называется «абстрактной ролью»!
Пример JAVA-кода режима агента:
Абстрактная роль: абстрактный класс или интерфейс.
Скопируйте код кода следующим образом:
интерфейсБизнес
{
недействительный doAction();
}
Реальная роль: действительно реализует интерфейс бизнес-логики.
Роль агента: он не реализует интерфейс бизнес-логики, но вызывает реальную роль для его реализации.
Скопируйте код кода следующим образом:
класс BusinessImplProxy реализует бизнес
{
частный БизнесИмпл би;
общественная недействительность doAction()
{
если (би==ноль)
{
би = новый BusinessImpl();
}
доБефор();
би.доДействие();
сделатьПосле();
}
публичная недействительность doBefore()
{
System.out.println("Предварительная обработка!");
}
публичная недействительность doAfter()
{
System.out.println("Постобработка!");
}
}
//тестовый класс
классный тест
{
public static void main(String[] args)
{
//Ссылочные переменные определяются как абстрактные типы ролей
Бизнес би = новый BusinessImplProxy();
би.доДействие();
}
}
Скопируйте код кода следующим образом:
<span></span>
Таким образом, при поддержке JVM прокси-классы («роли агента») могут генерироваться динамически во время выполнения, и мы можем решить проблему расширения кода в вышеуказанном режиме прокси. После использования динамического прокси «роли агента» не потребуются. должен быть сгенерирован вручную, который динамически генерируется JVM во время выполнения путем указания трех параметров: загрузчика классов, массива интерфейса и обработчика вызовов.
Пример JAVA-кода режима динамического прокси:
Скопируйте код кода следующим образом:
импортировать java.lang.reflect.IndictionHandler;
импортировать java.lang.reflect.Proxy;
импортировать java.lang.reflect.Method;
//Абстрактная роль: реализация динамического прокси Java в настоящее время поддерживает только интерфейсы и не поддерживает абстрактные классы.
интерфейс БизнесФу
{
недействительный Фу();
}
интерфейсБизнесБар
{
Строковая панель (строковое сообщение);
}
//Реальная роль: реальная реализация методов бизнес-логики
класс BusinessFooImpl реализует BusinessFoo
{
публичная пустота foo()
{
System.out.println("BusinessFooImpl.foo()");
}
}
класс BusinessBarImpl реализует BusinessBar
{
общедоступная строковая панель (строковое сообщение)
{
System.out.println("BusinessBarImpl.bar()");
ответное сообщение;
}
}
//Динамическая роль: динамически генерировать прокси-класс
класс BusinessImplProxy реализует InlocationHandler
{
объект частного объекта;
БизнесИмплПрокси() {
}
BusinessImplProxy (Объект Object) {
this.obj = объект;
}
Открытый вызов объекта (прокси-сервер объекта, метод метода, объект [] args) выдает Throwable
{
Результат объекта = ноль;
доБефор();
результат = метод.invoke(obj,args);
сделатьПосле();
вернуть результат;
}
общественная недействительность doBefore () {
System.out.println("сделайте что-нибудь перед бизнес-логикой");
}
общественная недействительность doAfter () {
System.out.println("сделайте что-нибудь после Бизнес-логики");
}
Фабрика общедоступных статических объектов (Object obj)
{
Класс cls = obj.getClass();
return Proxy.newProxyInstance(cls.getClassLoader(),cls.getInterfaces(),new BusinessImplProxy(obj));
}
}
//тестовый класс
открытый класс DynamicProxy
{
public static void main(String[] args) выдает Throwable
{
BusinessFooImpl bfoo = новый BusinessFooImpl ();
BusinessFoo bf = (BusinessFoo)BusinessImplProxy.factory(bfoo);
бф.фу();
Система.out.println();
BusinessBarImpl bbar = новый BusinessBarImpl ();
BusinessBar bb = (BusinessBar)BusinessImplProxy.factory(bbar);
String message = bb.bar("Hello,World");
System.out.println(сообщение);
}
}
Описание хода программы:
new BusinessFooImpl(); создает «настоящую роль», передает ее фабричному методу BusinessImplProxy.factory(), а затем инициализирует «процессор вызова» — класс, реализующий InvokeHandler. И возвращает динамически созданный экземпляр прокси-класса. Поскольку «роль агента» также должна реализовывать метод бизнес-логики, предоставляемый «абстрактной ролью», ее можно преобразовать в BusinessBar и назначить ссылке bb, указывающей на тип BusinessBar.
Метод newProxyInstance(ClassLoader loader, Class<?>[]interfaces, InvokeHandler h) позволяет программистам указывать параметры и динамически возвращать требуемый прокси-класс, в то время как метод ignore(Object proxy, Method Method, Object[] args) используется JVM вызывается динамически во время выполнения. Когда выполняется метод "bb.bar("Hello,World");" JVM динамически назначает "процессор вызова", передает параметры внешнему вызову и вызывает метод.invoke(obj, args) для его фактического выполнения. !
Статический метод BusinessImplProxy.Factory используется для динамического создания прокси-классов («ролей агента»). Роли прокси-сервера динамически генерируются во время выполнения на основе различных интерфейсов бизнес-логики BusinessFoo и BusinessBar. «Абстрактная роль», «роль агента» и обработчик вызова (класс, реализующий интерфейс InfectionHandler) могут быть изменены, поэтому динамический прокси JAVA очень мощный.