определение:
Предоставьте суррогатный или заполнитель для другого объекта для контроля доступа к нему.
Прокси для других объектов для контроля доступа к этому объекту.
Общее описание:
Как правило, он содержит три роли: абстрактная тема, конкретная тема и тема агента.
Общая классная диаграмма:
Общий код:
Package Proxy; // Аннотация Тема Класс: Общедоступный интерфейс субъект {public void dosomething ();} Package Proxy; // конкретный класс темы Общедоступный класс RealSubject реализует субъект {@Override public void dosomething () {System.out.println ("Business Logic ..."); }} Package Proxy; // Прокси -класс прокси -класс Прокси реализует субъект {частный субъект sub = null; @Override public void dosomething () {this.sub.dosomething (); } public Proxy (субъект sub) {this.sub = sub; }} Package Proxy; // Клиент открытого класса клиент {public static void main (string [] args) {subject RealSub = new RealSubject (); Субъект прокси = новый прокси (RealSub); proxy.dosomething (); }}преимущество :
1. Ясные обязанности
2. Высокое расширение
Расширения прокси -режима:
Нормальный агент:
Конкретные тематические классы прозрачны для уровня высокого уровня, а конкретные тематические классы построены в прокси-классах.
Реализация кода:
Пакет GeneralProxy; Общественный интерфейс субъект {public void dosomething ();} пакет GeneralProxy; открытый класс RealSubject реализует субъект {частная строка name = null; @Override public void dosomething () {System.out.println (this.name + "прокси, выполнение бизнес -логики ..."); } public RealSubject (субъект Proxy, String name) Throws Exception {if (proxy == null) {Throw New Exception ("Прокси -объект не может быть создан"); } else {this.name = name; }}} Пакет GeneralProxy; Public Class Proxy реализует субъект {частный предмет RealSub = null; public proxy (string name) {try {RealSub = new RealSubject (это, имя); } catch (Exception e) {e.printstackTrace (); }} public void dosomething () {realsub.dosomething (); }} Пакет GeneralProxy; Public Class Client {public static void main (string [] args) {// обычный прокси -субъект прокси = новый прокси ("Zhang San"); proxy.dosomethaing (); }}
Принудительный прокси:
Вы должны получить объект класса темы прокси, получив доступ к конкретному тематическому классу, а затем использовать класс темы прокси для управления доступом.
Реализация кода:
Пакет должен Общественный интерфейс субъект {public void dosomething (); Общественный предмет getProxy ();} Пакет udpproxy; открытый класс RealSubject реализует субъект {частная строка name = null; Частный предмет прокси = null; @Override public void dosomething () {if (isproxy ()) {System.out.println (this.name + "Прокси, выполнение бизнес -логики ..."); } else {System.out.println ("Пожалуйста, обратитесь к проксиму первым ..."); }} public RealSubject (String name) {this.name = name; } public subject getProxy () {proxy = new Proxy (this); вернуть это. } private boolean isproxy () {if (this.proxy == null) {return false; } else {return true; }}} Пакет udpproxy; Public Class Proxy реализует субъект {частный предмет RealSub = null; Public Proxy (Subject RealSub) {this.RealSub = RealSub; } public void doSomething () {this.RealSub.dosomething (); } public subject getProxy () {вернуть это; }} Пакет udpproxy; 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) Virtual Proxy позволяет создавать объекты с высокими задержками памяти при необходимости. Создайте только тогда, когда нам действительно нужен этот объект.
(3) Прокси-сервер копии на записи используется для управления копированием объектов путем откладывания копирования объектов, пока клиент действительно не нуждается в них. Это вариант виртуального прокси.
(4) Proxy Proxy) обеспечивает различные уровни прав доступа целевого объекта для разных клиентов
(5) Кэш прокси обеспечивает временное хранилище для вычислений. Это позволяет нескольким клиентам обмениваться результатами, чтобы уменьшить вычисления или задержку сети.
(6) Прокси -сервер брандмауэра управляет доступом к сетевым ресурсам и защищает предмет от вредоносных клиентов.
(7) SynchronizationProxy обеспечивает безопасный доступ к теме в случае многопоточного.
(8) Smart Strafer Proxy - Когда ссылается объект, он предоставляет некоторые дополнительные операции, такие как запись количества вызовов для этого объекта и т. Д.
(9) Сложность, скрывая прокси, используется для скрытия сложности сложного сбора класса и выполнения контроля доступа. Иногда это также называется фасадом прокси, что не сложно понять. Сложный скрытый прокси и режим внешнего вида отличается тем, что прокси управляет доступом, а режим внешнего вида отличается, потому что проксие управляет доступа, в то время как режим внешнего вида предоставляет только другой набор интерфейсов.