Skip to content

Урок 7. Заместитель (Proxy)

Шаблон проектирования "Заместитель" (Proxy) используется для создания объекта, который контролирует доступ к другому объекту. Это может быть полезно в различных ситуациях, например, для управления доступом, ленивой инициализации, кэширования, логирования и т.д.

Пример использования паттерна Proxy на Java

Рассмотрим пример, в котором мы создадим интерфейс Image, класс RealImage, который будет представлять реальный объект, и класс ProxyImage, который будет контролировать доступ к RealImage.

Шаг 1: Создание интерфейса

public interface Image {
    void display();
}

Шаг 2: Реализация реального объекта

public class RealImage implements Image {
    private String filename;

    public RealImage(String filename) {
        this.filename = filename;
        loadImageFromDisk();
    }

    private void loadImageFromDisk() {
        System.out.println("Loading " + filename);
    }

    @Override
    public void display() {
        System.out.println("Displaying " + filename);
    }
}

Шаг 3: Реализация прокси

public class ProxyImage implements Image {
    private RealImage realImage;
    private String filename;

    public ProxyImage(String filename) {
        this.filename = filename;
    }

    @Override
    public void display() {
        if (realImage == null) {
            realImage = new RealImage(filename);
        }
        realImage.display();
    }
}

Шаг 4: Использование прокси

Теперь мы можем использовать наш прокси в коде:

public class ProxyPatternDemo {
    public static void main(String[] args) {
        Image image1 = new ProxyImage("image1.jpg");
        Image image2 = new ProxyImage("image2.jpg");

        // Изображение загружается с диска только при первом вызове display()
        image1.display();
        System.out.println("");

        // Изображение не загружается с диска, так как оно уже было загружено
        image1.display();
        System.out.println("");

        // Изображение загружается с диска только при первом вызове display()
        image2.display();
        System.out.println("");

        // Изображение не загружается с диска, так как оно уже было загружено
        image2.display();
    }
}

Объяснение

  1. Интерфейс Image: Определяет метод display(), который будет реализован как реальным объектом, так и прокси.

  2. Класс RealImage: Реализует интерфейс Image. Он загружает изображение с диска при создании объекта и отображает его.

  3. Класс ProxyImage: Также реализует интерфейс Image. Он содержит ссылку на RealImage и управляет его созданием. Если RealImage еще не создан, он создается при первом вызове метода display().

  4. Класс ProxyPatternDemo: Демонстрирует использование прокси. При первом вызове display() изображение загружается с диска, а при последующих вызовах оно просто отображается без повторной загрузки.

Заключение

Паттерн "Заместитель" позволяет контролировать доступ к объектам и может быть использован в различных сценариях, таких как управление доступом, кэширование, логирование и т.д. В приведенном примере мы увидели, как можно реализовать прокси для управления загрузкой изображений.

пример

https://gitlab.com/synergy9980417/razdel2/7_7