Что такое паттерн Proxy
1️⃣ Как кратко ответить
Паттерн Proxy — это структурный шаблон проектирования, который предоставляет объект-заместитель для управления доступом к другому объекту. Он используется для контроля доступа, оптимизации производительности или добавления дополнительной функциональности без изменения оригинального объекта.
2️⃣ Подробное объяснение темы
Паттерн Proxy, или "заместитель", — это структурный шаблон проектирования, который позволяет создать объект, выступающий в роли интерфейса к другому объекту. Этот паттерн полезен, когда необходимо контролировать доступ к объекту, добавлять дополнительные действия перед или после вызова методов объекта, или оптимизировать работу с объектом.
Зачем нужен паттерн Proxy
- Контроль доступа: Proxy может ограничивать доступ к объекту, например, проверяя права пользователя перед выполнением операции.
- Оптимизация производительности: Proxy может кэшировать результаты операций, чтобы избежать повторных вычислений.
- Ленивая инициализация: Proxy может откладывать создание ресурсоемкого объекта до момента, когда он действительно понадобится.
- Логирование и мониторинг: Proxy может добавлять логирование вызовов методов или мониторинг их выполнения.
Как работает паттерн Proxy
Proxy реализует тот же интерфейс, что и оригинальный объект, и содержит ссылку на него. Когда клиент вызывает метод Proxy, он может выполнить дополнительные действия до или после передачи вызова оригинальному объекту.
Пример использования паттерна Proxy
Рассмотрим пример, где Proxy используется для кэширования данных, получаемых из API.
// Интерфейс, который реализуют как оригинальный объект, так и Proxy
class ApiService {
fetchData() {
throw new Error("Этот метод должен быть переопределен");
}
}
// Оригинальный объект, который выполняет ресурсоемкую операцию
class RealApiService extends ApiService {
fetchData() {
console.log("Fetching data from API...");
// Имитация задержки при получении данных
return { data: "API data" };
}
}
// Proxy, который кэширует данные, чтобы избежать повторных запросов
class CachedApiService extends ApiService {
constructor() {
super();
this.realApiService = new RealApiService();
this.cache = null;
}
fetchData() {
if (this.cache === null) {
console.log("Cache is empty. Fetching new data...");
this.cache = this.realApiService.fetchData();
} else {
console.log("Returning cached data...");
}
return this.cache;
}
}
// Использование Proxy
const apiService = new CachedApiService();
console.log(apiService.fetchData()); // Вывод: Cache is empty. Fetching new data... Fetching data from API...
console.log(apiService.fetchData()); // Вывод: Returning cached data...
Объяснение кода
- ApiService: Определяет интерфейс с методом
fetchData, который должны реализовать как оригинальный объект, так и Proxy. - RealApiService: Реализует метод
fetchData, который имитирует получение данных из API. - CachedApiService: Наследует
ApiServiceи содержит ссылку наRealApiService. Он кэширует результат вызоваfetchData, чтобы избежать повторных обращений к API. - fetchData в CachedApiService: Проверяет, есть ли данные в кэше. Если нет, вызывает
fetchDataуRealApiServiceи сохраняет результат в кэше. Если данные уже есть, возвращает их из кэша.
Паттерн Proxy позволяет добавлять дополнительную функциональность к объекту без изменения его кода, что делает его мощным инструментом для решения различных задач в разработке.
🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!
Подписаться