Урок 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();
}
}
Объяснение
-
Интерфейс
Image
: Определяет методdisplay()
, который будет реализован как реальным объектом, так и прокси. -
Класс
RealImage
: Реализует интерфейсImage
. Он загружает изображение с диска при создании объекта и отображает его. -
Класс
ProxyImage
: Также реализует интерфейсImage
. Он содержит ссылку наRealImage
и управляет его созданием. ЕслиRealImage
еще не создан, он создается при первом вызове методаdisplay()
. -
Класс
ProxyPatternDemo
: Демонстрирует использование прокси. При первом вызовеdisplay()
изображение загружается с диска, а при последующих вызовах оно просто отображается без повторной загрузки.
Заключение
Паттерн "Заместитель" позволяет контролировать доступ к объектам и может быть использован в различных сценариях, таких как управление доступом, кэширование, логирование и т.д. В приведенном примере мы увидели, как можно реализовать прокси для управления загрузкой изображений.
пример
https://gitlab.com/synergy9980417/razdel2/7_7