Для чего нужен паттерн проектирования Proxy

«Для чего нужен паттерн проектирования Proxy» — вопрос из категории Паттерны, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Паттерн Proxy предоставляет суррогатный объект, контролирующий доступ к другому объекту. Основные сценарии использования:

  1. Ленивая инициализация (Virtual Proxy) – откладывает создание дорогостоящего объекта до момента его реального использования.
  2. Контроль доступа (Protection Proxy) – проверяет права доступа перед вызовом основного объекта.
  3. Логирование (Logging Proxy) – добавляет логирование вызовов методов.
  4. Кеширование (Cache Proxy) – сохраняет результаты запросов для повторного использования.

Пример Virtual Proxy:

interface Image {
    void display();
}

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);
    }
}

class ProxyImage implements Image {
    private RealImage realImage;
    private String filename;
    public ProxyImage(String filename) {
        this.filename = filename;
    }
    public void display() {
        if (realImage == null) {
            realImage = new RealImage(filename);
        }
        realImage.display();
    }
}