← Назад к вопросам

Что такое паттерн Proxy?

2.0 Middle🔥 191 комментариев
#SOLID и паттерны проектирования

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

# Что такое паттерн 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 — для расширения.

Что такое паттерн Proxy? | PrepBro