Перейти к основному содержимому

Что это такое

Паттерн Заместитель (Proxy) ставит перед настоящим объектом подставного с тем же интерфейсом. Вызывающий код обращается к заместителю как к настоящему объекту; заместитель сам решает, когда и как задействовать оригинал.

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


Пример: кэширующий заместитель

Настоящий сервис погоды работает медленно. Заместитель отвечает на повторные запросы из своего кэша и обращается к сервису только за новыми данными — за тем же самым интерфейсом.

Подставной объект, который помнит

Первый запрос о городе Paris доходит до удалённого сервиса, второй берётся из кэша — строка «обращаемся к удалённому сервису» печатается только один раз. Одна проверка isset по массиву кэша решает, каким путём пойдёт запрос.

Prompt
Напишите PHP-скрипт с кэширующим Заместителем (Proxy): интерфейс Weather (метод forecast), класс WeatherService, который печатает сообщение при обращении к удалённому сервису, и заместитель CachedWeather, который хранит ответы в массиве и отдаёт повторные запросы из кэша. Запросите один и тот же город дважды и напечатайте оба ответа.
Вывод: PHP-скрипт

Когда использовать

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

Не используйте, когда объект ваш и поведение должно находиться внутри него. Заместитель управляет доступом; декоратор добавляет поведение слоями — выбирайте по замыслу.


Плюсы и минусы

Плюсы: вызывающий код вообще не нужно менять; дорогая работа пропускается или контролируется в одном месте.

Минусы: скрытое поведение — вызывающий код может получить ответ из кэша, не зная об этом; устаревший кэш и неожиданные отказы приходится отлаживать за безобидным с виду интерфейсом.