«1. Обзор

Шаблон Proxy позволяет нам создать посредника, который действует как интерфейс к другому ресурсу, а также скрывает базовую сложность компонента.

2. Пример шаблона прокси

Рассмотрим тяжелый объект Java (например, соединение JDBC или SessionFactory), который требует некоторой начальной настройки.

Мы хотим, чтобы такие объекты инициализировались только по требованию, и когда они будут инициализированы, мы хотели бы повторно использовать их для всех вызовов:

Теперь давайте создадим простой интерфейс и конфигурацию для этого объекта:

public interface ExpensiveObject {
    void process();
}

~ ~~ И реализация этого интерфейса с большой начальной конфигурацией:

public class ExpensiveObjectImpl implements ExpensiveObject {

    public ExpensiveObjectImpl() {
        heavyInitialConfiguration();
    }
    
    @Override
    public void process() {
        LOG.info("processing complete.");
    }
    
    private void heavyInitialConfiguration() {
        LOG.info("Loading initial configuration...");
    }
    
}

Теперь мы будем использовать шаблон Proxy и инициализировать наш объект по запросу:

public class ExpensiveObjectProxy implements ExpensiveObject {
    private static ExpensiveObject object;

    @Override
    public void process() {
        if (object == null) {
            object = new ExpensiveObjectImpl();
        }
        object.process();
    }
}

Всякий раз, когда наш клиент вызывает метод process() , они просто увидят процесс обработки, а начальная конфигурация всегда останется скрытой:

public static void main(String[] args) {
    ExpensiveObject object = new ExpensiveObjectProxy();
    object.process();
    object.process();
}

Обратите внимание, что мы вызываем метод process() дважды. За кулисами часть настроек произойдет только один раз — при первой инициализации объекта.

Для каждого последующего вызова этот шаблон будет пропускать первоначальную настройку, и будет выполняться только обработка:

Loading initial configuration...
processing complete.
processing complete.

3. Когда использовать прокси

Важно понимать, как использовать шаблон.

Понимание того, когда его использовать, имеет решающее значение.

Давайте поговорим о том, когда использовать шаблон Proxy:

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

4. Заключение

В этой статье мы рассмотрели шаблон проектирования прокси. Это хороший выбор в следующих случаях:

    Когда мы хотим иметь упрощенную версию объекта или более безопасный доступ к объекту Когда нам нужна локальная версия удаленного объекта

Полный исходный код для этого примера доступен на GitHub.