Что такое паттерн "Заместитель" (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(); // Возвращает результат из кэша
Когда стоит использовать паттерн «Заместитель»?
- Нужно контролировать доступ к объекту.
- Требуется добавить ленивую загрузку или кэширование.
- Нужно добавить дополнительную логику при работе с объектом без изменения его кода.
- При работе с удалёнными ресурсами или затратными объектами.
Отличие от других паттернов
- В отличие от декоратора, заместитель контролирует доступ, а не расширяет функциональность.
- В отличие от адаптера, заместитель использует тот же интерфейс, что и оригинальный объект.
Плюсы паттерна
- Упрощение управления доступом.
- Экономия ресурсов за счёт ленивой загрузки и кэширования.
- Возможность добавления дополнительной логики без изменения реального объекта.
- Повышение безопасности и контроля.
Минусы паттерна
- Усложнение структуры проекта.
- Может привести к избыточному количеству классов.
- Потенциальные задержки из-за дополнительных уровней вызова.