Skip to content

Применимость и шаги реализации заместителя

Применимость паттерна

Ленивая инициализация (виртуальный прокси). Используется в тех случаях, когда у нас есть тяжёлый объект, грузящий данные из файловой системы или базы данных.

Вместо того чтобы грузить данные сразу после старта программы, можно сэкономить ресурсы и создать объект тогда, когда он действительно понадобится.

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

Прокси может проверять доступ при каждом вызове и передавать выполнение служебному объекту, если доступ разрешён.

Локальный запуск сервиса (удалённый прокси). Используется, когда настоящий сервисный объект находится на удалённом сервере.

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

Логирование запросов (логирующий прокси). Применим тогда, когда требуется сохранять историю обращений клиента к сервисному объекту. Заместитель может сохранять историю обращения клиента к сервисному объекту.

Кеширование объектов («умная» ссылка). Используется в тех случаях, когда нужно кешировать результаты запросов клиентов и управлять их жизненным циклом.

Заместитель может подсчитывать количество ссылок на сервисный объект, которые были отданы клиенту и остались активными. Когда все ссылки освободятся, можно будет освободить и сам сервисный объект (например, закрыть подключение к базе данных).

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

Шаги реализации паттерна Proxy

  1. Определи интерфейс, который сделал бы заместитель и оригинальный объект взаимозаменяемыми.
  2. Создай класс заместителя. Он должен содержать ссылку на сервисный объект. Чаще всего сервисный объект создаётся самим заместителем, но в редких случаях заместитель получает готовый сервисный объект от клиента через конструктор.
  3. Реализуй методы заместителя в зависимости от его предназначения. В большинстве случаев, проделав какую-то полезную работу, методы заместителя должны передать запрос сервисному объекту.
  4. Подумай о введении фабрики, которая решала бы, какой из объектов создавать — заместитель или реальный сервисный объект. С другой стороны, эта логика может быть помещена в создающий метод самого заместителя.
  5. Подумай, не реализовать ли ленивую инициализацию сервисного объекта при первом обращении клиента к методам заместителя.

Преимущества и недостатки Proxy

+ Позволяет контролировать сервисный объект незаметно для клиента.

+ Может работать, даже если сервисный объект ещё не создан.

+ Может контролировать жизненный цикл служебного объекта.

— Усложняет код программы из-за введения дополнительных классов.

— Увеличивает время отклика от сервиса.