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

Это могло бы быть решением для расширения его функциональных возможностей без необходимости изменять сам класс. Прокси-сервер использует тот же интерфейс, что и исходный класс, поэтому их можно использовать взаимозаменяемо. Это дает нам большую гибкость и не создает тесной связи.

Прокси может быть полезен для таких задач, как:

  • логирование
  • Ловля исключений
  • Кеширование
  • Отправка событий до или после вызова какого-либо метода
  • Проверка доступа

Представим, что у нас есть система, которая позволяет выполнять основные операции с файлом.

Для простоты каждый метод ничего не возвращает (даже get). Наша реализация будет регистрировать только каждый вызов метода.

Все работает нормально, но нашей системе не хватает проверки. Мы хотели бы разрешить доступ к файлам только выбранным вошедшим в систему пользователям. Мы можем изменить FileProvider и добавить проверку или сохранить простоту и переместить эту логику в другой класс. Это хороший вариант использования шаблона прокси.

Он будет использовать отдельный класс, который позаботится о проверке. Такой подход сделает наш код более соответствующим принципу единой ответственности (SRP).

Использование суперглобальных переменных непосредственно в коде не является хорошей практикой, но мы хотим, чтобы пример был как можно более простым и коротким, и будем использовать $_SESSION без каких-либо посредников.

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

Давайте теперь посмотрим на наше приложение в действии.

Наши файлы в безопасности. Все заработало как положено. В нашем шаблоне прокси есть следующие элементы:

  • Subject (File): определяет общий интерфейс для нашего Real Subject и Proxy.
  • Настоящий предмет (FileProvider): реализация предмета
  • Прокси (AuthFile): содержит ссылку на реальный субъект и разделяет интерфейсы субъекта.

Преимущества

  • Позволяет расширить функциональность объекта без его модификации
  • Способствует разделению ответственности
  • Вы можете создать несколько прокси для объекта в зависимости от варианта использования и прикрепить их во время выполнения

Ресурсы

Полный исходный код и некоторые другие шаблоны доступны здесь:



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