Proxy — это структурный паттерн, который подставляет вместо реального объекта объект-заместитель, контролирующий доступ к оригиналу.
Простыми словами: прокси выглядит как оригинал, но перед вызовом может проверить права, закэшировать результат или создать объект лениво.
▪️ Пример:
Сервис загрузки документов: реальная загрузка — тяжёлая операция. Прокси проверяет права доступа и кэширует результат.
interface DocumentService {
String loadDocument(String docId);
}
// Реальный сервис — тяжёлая операция
class RealDocumentService implements DocumentService {
public String loadDocument(String docId) {
System.out.println("Загрузка из хранилища: " + docId);
return "Содержимое документа " + docId;
}
}
// Прокси — контроль доступа + кэширование
class DocumentServiceProxy implements DocumentService {
private final RealDocumentService realService = new RealDocumentService();
private final Map<String, String> cache = new HashMap<>();
private final Set<String> allowedRoles;
public DocumentServiceProxy(Set<String> allowedRoles) {
this.allowedRoles = allowedRoles;
}
public String loadDocument(String docId) {
// 1. Проверка доступа
String currentRole = SecurityContext.getCurrentRole();
if (!allowedRoles.contains(currentRole)) {
throw new SecurityException("Нет доступа");
}
// 2. Кэширование
return cache.computeIfAbsent(docId, realService::loadDocument);
}
}
// Клиент работает с прокси как с оригиналом
DocumentService service = new DocumentServiceProxy(Set.of("ADMIN", "EDITOR"));
String doc = service.loadDocument("report-2026");▪️ Виды прокси
— Protection Proxy — контроль доступа (Spring Security)
— Caching Proxy — кэширование результатов
— Lazy Proxy — отложенная инициализация (Hibernate lazy loading)
— Remote Proxy — доступ к удалённому объекту (RMI)
▪️ Proxy vs Decorator
— Proxy: контролирует жизненный цикл и доступ к объекту
— Decorator: добавляет поведение, не контролируя доступ
▪️ Минус
Увеличивает задержку отклика; усложняет отладку при нескольких слоях проксирования.
🐸 Библиотека собеса по Java
#patterns