Что такое паттерн Proxy?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
# Что такое паттерн Proxy?
Паттерн Proxy (Заместитель) — это структурный паттерн проектирования, который предоставляет объект-заместитель для управления доступом к другому объекту. Proxy контролирует, фильтрует или модифицирует операции с исходным объектом без изменения его интерфейса.
Основные компоненты
Subject — интерфейс, который реализуют как RealSubject, так и Proxy. RealSubject — реальный объект, к которому нужен контролируемый доступ. Proxy — заместитель, который управляет доступом и выполняет дополнительные операции.
Практический пример
// Subject интерфейс
public interface Image {
void display();
}
// RealSubject - реальный объект
public class RealImage implements Image {
private String filename;
public RealImage(String filename) {
this.filename = filename;
loadFromDisk();
}
private void loadFromDisk() {
System.out.println("Loading " + filename);
}
public void display() {
System.out.println("Displaying " + filename);
}
}
// Proxy - управляет доступом и кэшированием
public class ProxyImage implements Image {
private String filename;
private RealImage realImage;
public ProxyImage(String filename) {
this.filename = filename;
}
public void display() {
if (realImage == null) {
realImage = new RealImage(filename);
}
realImage.display();
}
}
// Использование
Image img = new ProxyImage("photo.jpg");
img.display(); // Загрузит изображение только при первом вызове
img.display(); // Загрузка не произойдёт, используется кэшированный объект
Варианты использования
Lazy Loading (Ленивая загрузка) — объект создаётся только когда его действительно нужно использовать. Полезно для тяжёлых ресурсов.
Access Control (Контроль доступа) — Proxy может проверить права доступа перед выполнением операции.
Логирование и мониторинг — Proxy может логировать вызовы, что полезно для отладки и аналитики.
Кэширование — Результаты дорогостоящих операций могут кэшироваться в Proxy.
Spring примеры
В Spring Proxy часто используется в AOP (Aspect-Oriented Programming):
@Service
public class UserService {
@Transactional // Это создаёт Proxy для управления транзакциями
public void saveUser(User user) {
// Proxy автоматически откроет транзакцию перед выполнением
// и закроет её после
}
@Cacheable("users") // Proxy кэширует результаты
public User getUserById(Long id) {
return repository.findById(id);
}
}
Отличие от Decorator
Оба паттерна похожи, но имеют разные цели:
- Proxy управляет доступом и контролирует поведение
- Decorator добавляет новую функциональность, расширяя возможности
Proxy используется для контроля, Decorator — для расширения.