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 .