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 .