Статьи

Шаблон дизайна прокси в Java

Прокси-объекты или суррогаты предоставляют заполнитель для другого объекта для управления доступом к этому объекту. Прокси-сервер действует как упрощенная или упрощенная версия исходного объекта. Он поддерживает те же операции, что и исходный объект, но может делегировать эти запросы исходному объекту для их достижения.

Шаблон проектирования Proxy — это структурный шаблон, в котором прокси-класс оборачивает реальный предметный класс. Код клиента взаимодействует только с прокси-классом, а не с реальным субъектом.

В этом уроке мы узнаем, как реализовать шаблон проектирования прокси.

Зачем использовать прокси?

Существует три наиболее распространенных сценария, в которых нам может понадобиться прокси-класс:

  1. Виртуальный прокси: когда объект требует довольно много ресурсов, мы можем использовать этот шаблон. Прокси-класс, который мы создаем здесь, известен как виртуальный прокси. Некоторые примеры использования могут включать загрузку изображений с очень высоким разрешением на веб-страницу. Идея состоит в том, чтобы отложить создание дорогого ресурса до тех пор, пока он не понадобится
  2. Защитный прокси: мы также можем использовать прокси-класс для управления доступом к нашему реальному предметному классу. Например, предоставление пользователям доступа к веб-сайту на основе их конкретных ролей
  3. Удаленный прокси. Реальным примером такой реализации может служить 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, являются их собственными.