Применимость и шаги реализации заместителя
Применимость паттерна
Ленивая инициализация (виртуальный прокси). Используется в тех случаях, когда у нас есть тяжёлый объект, грузящий данные из файловой системы или базы данных.
Вместо того чтобы грузить данные сразу после старта программы, можно сэкономить ресурсы и создать объект тогда, когда он действительно понадобится.
Защита доступа (защищающий прокси). Этот паттерн применим в тех случаях, когда в программе есть разные типы пользователей и нам хочется защитить объект от неавторизованного доступа. Например, если наши объекты — это важная часть операционной системы, а пользователи — это сторонние программы (хорошие или вредоносные).
Прокси может проверять доступ при каждом вызове и передавать выполнение служебному объекту, если доступ разрешён.
Локальный запуск сервиса (удалённый прокси). Используется, когда настоящий сервисный объект находится на удалённом сервере.
В этом случае заместитель транслирует запросы клиента в вызовы по сети в протоколе, понятном удалённому сервису.
Логирование запросов (логирующий прокси). Применим тогда, когда требуется сохранять историю обращений клиента к сервисному объекту. Заместитель может сохранять историю обращения клиента к сервисному объекту.
Кеширование объектов («умная» ссылка). Используется в тех случаях, когда нужно кешировать результаты запросов клиентов и управлять их жизненным циклом.
Заместитель может подсчитывать количество ссылок на сервисный объект, которые были отданы клиенту и остались активными. Когда все ссылки освободятся, можно будет освободить и сам сервисный объект (например, закрыть подключение к базе данных).
Кроме того, заместитель может отслеживать, не менял ли клиент сервисный объект. Это позволит использовать объекты повторно и экономить ресурсы, особенно если речь идёт о больших прожорливых сервисах.
Шаги реализации паттерна Proxy
- Определи интерфейс, который сделал бы заместитель и оригинальный объект взаимозаменяемыми.
- Создай класс заместителя. Он должен содержать ссылку на сервисный объект. Чаще всего сервисный объект создаётся самим заместителем, но в редких случаях заместитель получает готовый сервисный объект от клиента через конструктор.
- Реализуй методы заместителя в зависимости от его предназначения. В большинстве случаев, проделав какую-то полезную работу, методы заместителя должны передать запрос сервисному объекту.
- Подумай о введении фабрики, которая решала бы, какой из объектов создавать — заместитель или реальный сервисный объект. С другой стороны, эта логика может быть помещена в создающий метод самого заместителя.
- Подумай, не реализовать ли ленивую инициализацию сервисного объекта при первом обращении клиента к методам заместителя.
Преимущества и недостатки Proxy
+ Позволяет контролировать сервисный объект незаметно для клиента. + Может работать, даже если сервисный объект ещё не создан. + Может контролировать жизненный цикл служебного объекта. | — Усложняет код программы из-за введения дополнительных классов. — Увеличивает время отклика от сервиса. |