Что такое паттерн "Заместитель" (Proxy)

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

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

Преимущества паттерна «Заместитель»

  • Управление доступом к объекту.
  • Ленивое создание или загрузка ресурсов.
  • Добавление дополнительной логики без изменения оригинального объекта.
  • Кэширование результатов и оптимизация работы.

Пример:

  • Оригинальный объект: Большой файл или удалённый сервис.
  • Заместитель: Контролирует доступ и кэширует результаты.

Где применяется паттерн «Заместитель»?

  • Виртуальные прокси (ленивая загрузка объектов).
  • Защитные прокси (контроль прав доступа).
  • Удалённые прокси (работа с удалёнными сервисами).
  • Кэширующие прокси.

Пример реализации на JavaScript

// Интерфейс объекта class Subject { request() { throw new Error("Метод request() должен быть реализован"); } } // Реальный объект class RealSubject extends Subject { request() { console.log("Выполнение запроса в реальном объекте"); } } // Заместитель class ProxySubject extends Subject { constructor(realSubject) { super(); this.realSubject = realSubject; this.cache = null; } request() { if (this.cache) { console.log("Возвращаем результат из кэша"); return this.cache; } console.log("Выполняем запрос через заместителя"); this.cache = this.realSubject.request(); return this.cache; } } // Использование const realSubject = new RealSubject(); const proxy = new ProxySubject(realSubject); proxy.request(); // Выполняет запрос через заместителя proxy.request(); // Возвращает результат из кэша

Когда стоит использовать паттерн «Заместитель»?

  • Нужно контролировать доступ к объекту.
  • Требуется добавить ленивую загрузку или кэширование.
  • Нужно добавить дополнительную логику при работе с объектом без изменения его кода.
  • При работе с удалёнными ресурсами или затратными объектами.

Отличие от других паттернов

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

Плюсы паттерна

  • Упрощение управления доступом.
  • Экономия ресурсов за счёт ленивой загрузки и кэширования.
  • Возможность добавления дополнительной логики без изменения реального объекта.
  • Повышение безопасности и контроля.

Минусы паттерна

  • Усложнение структуры проекта.
  • Может привести к избыточному количеству классов.
  • Потенциальные задержки из-за дополнительных уровней вызова.