Прокси-объекты или суррогаты предоставляют заполнитель для другого объекта для управления доступом к этому объекту. Прокси-сервер действует как упрощенная или упрощенная версия исходного объекта. Он поддерживает те же операции, что и исходный объект, но может делегировать эти запросы исходному объекту для их достижения.
Шаблон проектирования Proxy — это структурный шаблон, в котором прокси-класс оборачивает реальный предметный класс. Код клиента взаимодействует только с прокси-классом, а не с реальным субъектом.
В этом уроке мы узнаем, как реализовать шаблон проектирования прокси.
Зачем использовать прокси?
Существует три наиболее распространенных сценария, в которых нам может понадобиться прокси-класс:
- Виртуальный прокси: когда объект требует довольно много ресурсов, мы можем использовать этот шаблон. Прокси-класс, который мы создаем здесь, известен как виртуальный прокси. Некоторые примеры использования могут включать загрузку изображений с очень высоким разрешением на веб-страницу. Идея состоит в том, чтобы отложить создание дорогого ресурса до тех пор, пока он не понадобится
- Защитный прокси: мы также можем использовать прокси-класс для управления доступом к нашему реальному предметному классу. Например, предоставление пользователям доступа к веб-сайту на основе их конкретных ролей
- Удаленный прокси. Реальным примером такой реализации может служить Google Docs. Веб-браузер хранит прокси-объекты локально, которые затем синхронизируются с объектами на удаленном сервере.
Диаграмма UML:
Шаблон проектирования Proxy имеет следующие компоненты:
- Предмет: интерфейс, определяющий договор для реального субъекта
- RealSubject : это класс, для которого мы хотим иметь прокси
- Прокси: это класс прокси для реального субъекта. Классы Proxy и RealSubject реализуют интерфейс Subject.
- Клиент : класс, который взаимодействует с прокси через интерфейс Subject
Классы Proxy и RealSubject реализуют интерфейс Subject . Кроме того, клиент взаимодействует с интерфейсом субъекта, что скрывает тот факт, что клиент взаимодействует с прокси вместо реального субъекта.
Прокси-класс оборачивает реальную тему и может делегировать некоторые запросы реальной теме. Однако не все запросы делегируются предметному классу . Прокси-сервер способен справиться с некоторыми более легкими обязанностями.
Пример реализации:
Большинство организаций предоставляют ограниченный доступ к Интернету в своих помещениях. Итак, как это реализовано?
Идея заключается в создании защитного прокси.
Давайте начнем с определения интерфейса WebServer :
1
2
3
|
public interface WebServer { void makeRequest(String url); } |
Здесь метод makeRequest () отвечает за вызов веб-сервера с определенной конечной точкой.
Теперь давайте реализуем класс RealWebServer, который выполняет фактическую работу по достижению URL-адреса с помощью вызовов сетевого API:
1
2
3
4
5
6
7
|
public class RealWebServer implements WebServer { @Override public void makeRequest(String url) { //code to hit a particular url } } |
Наконец, мы создадим прокси-сервер и представим его нашим клиентам:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
|
public class ProxyServer implements WebServer { private RealWebServer realServer; private List<String> blockedSites = new ArrayList<>(); public ProxyWebServer() { this .realServer = new RealWebServer(); } public void blockWebsite(String url) { this .blockedSites.add(url); } @Override public void makeRequest(String url) { if (!blockedSites.contains(url)) { this .realServer.makeRequest(url); } else { System.out.println( "This website is blocked. Contact your administrator" ); } } } |
При этом все заблокированные сайты останутся недоступными на территории:
1
2
3
4
5
6
|
//code in main method WebServer server = new ProxyWebServer(); server.blockWebsite( "www.facebook.com" ); ... server.makeRequest( "www.facebook.com" ); // Prints 'This website is blocked. Contact your administrator' |
Вывод:
В этом уроке мы рассмотрели шаблон проектирования прокси.
Прокси-шаблон позволяет нам откладывать создание дорогого ресурса до тех пор, пока он не понадобится, контролировать доступ к реальному субъекту или локально представлять удаленный объект.
Java Reflection API использует прокси. Кроме того, логика ленивой выборки Hibernate внутренне использует этот шаблон.
Опубликовано на Java Code Geeks с разрешения Шубхры Шриваставы, партнера нашей программы JCG . Смотрите оригинальную статью здесь: Proxy Design Pattern в Java Мнения, высказанные участниками Java Code Geeks, являются их собственными. |