1. Обзор
Шаблон прокси-сервера позволяет нам создать посредника , который действует как интерфейс к другому ресурсу , а также скрывает основную сложность компонента.
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..."); } }
Теперь мы будем использовать шаблон прокси и инициализировать наш объект по требованию:
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. Когда использовать прокси-сервер
Важно понимать, как использовать шаблон.
Понимание того, когда использовать его, имеет решающее значение.
Давайте поговорим о том, когда использовать шаблон прокси:
- Когда нам нужна упрощенная версия сложного или тяжелого объекта. В этом случае мы можем представить его с помощью скелетного объекта, который загружает исходный объект по требованию, также называемый ленивой инициализацией. Это называется виртуальным прокси-сервером
- Когда исходный объект присутствует в другом адресном пространстве, и мы хотим представить его локально . Мы можем создать прокси-сервер, который выполняет все необходимые стандартные действия, такие как создание и поддержание соединения, кодирование, декодирование и т. Д., В то время как клиент обращается к нему так, как он присутствовал в их локальном адресном пространстве. Это называется удаленным прокси-сервером
- Когда мы хотим добавить уровень безопасности к исходному базовому объекту, чтобы обеспечить контролируемый доступ на основе прав доступа клиента . Это называется прокси-сервером защиты
4. Заключение
В этой статье мы рассмотрели шаблон проектирования прокси-сервера. Это хороший выбор в следующих случаях:
- Когда мы хотим иметь упрощенную версию объекта или получить к нему более безопасный доступ
- Когда нам нужна локальная версия удаленного объекта
Полный исходный код для этого примера доступен на GitHub .