Шаблон прокси - Загрузка в память

Я смотрю пример кода, который объясняет шаблон прокси. Вот код:

/**
* Proxy
*/
public class ImageProxy implements Image {

/**
 * Private Proxy data 
 */
private String imageFilePath;

/**
 * Reference to RealSubject
 */
private Image proxifiedImage;


public ImageProxy(String imageFilePath) {
    this.imageFilePath= imageFilePath;  
}

@Override
public void showImage() {

    // create the Image Object only when the image is required to be shown

    proxifiedImage = new HighResolutionImage(imageFilePath);

    // now call showImage on realSubject
    proxifiedImage.showImage();

}

}

/**
 * RealSubject
 */
public class HighResolutionImage implements Image {

public HighResolutionImage(String imageFilePath) {

    loadImage(imageFilePath);
}

private void loadImage(String imageFilePath) {

    // load Image from disk into memory
    // this is heavy and costly operation
}

@Override
public void showImage() {

    // Actual Image rendering logic

}

}

/**
  * Image Viewer program
 */
public class ImageViewer {


public static void main(String[] args) {

// assuming that the user selects a folder that has 3 images    
//create the 3 images   
Image highResolutionImage1 = new ImageProxy("sample/veryHighResPhoto1.jpeg");
Image highResolutionImage2 = new ImageProxy("sample/veryHighResPhoto2.jpeg");
Image highResolutionImage3 = new ImageProxy("sample/veryHighResPhoto3.jpeg");

// assume that the user clicks on Image one item in a list
// this would cause the program to call showImage() for that image only
// note that in this case only image one was loaded into memory
highResolutionImage1.showImage();

// consider using the high resolution image object directly
Image highResolutionImageNoProxy1 = new HighResolutionImage("sample/veryHighResPhoto1.jpeg");
Image highResolutionImageNoProxy2 = new HighResolutionImage("sample/veryHighResPhoto2.jpeg");
Image highResolutionImageBoProxy3 = new HighResolutionImage("sample/veryHighResPhoto3.jpeg");


// assume that the user selects image two item from images list
highResolutionImageNoProxy2.showImage();

// note that in this case all images have been loaded into memory 
// and not all have been actually displayed
// this is a waste of memory resources

}

}

Предположим, что прокси-паттерн реализован правильно, и это основной метод программы. Вот что мне интересно: комментарии в коде говорят, что когда мы используем прокси-объекты изображения, если мы загружаем изображение в память, загружается только это изображение. Но если мы не используем прокси и напрямую создаем реальные изображения, то при загрузке экземпляра этого класса мы загружаем все экземпляры класса в память. Я не понимаю, почему это так. Да, весь смысл шаблона прокси заключается в том, чтобы сделать это, но я не понимаю, почему все 3 объекта highResolutionImageNoProxy загружаются в память, когда мы вызываем highResolutionImageNoProxy2.showImage(); . Кто-нибудь может это объяснить?

Спасибо

Редактировать: кажется, я понял, почему. Потому что класс ImageProxy вызывает конструктор класса HighResolutionImage только тогда, когда он пытается выполнить операцию над объектом, но если мы создадим HighResolutionImage напрямую, то, поскольку его конструктор создает объект, все они загружаются в память.


person yrazlik    schedule 24.04.2013    source источник
comment
да, ваша редакция правильная :-)   -  person Vincent van der Weele    schedule 24.04.2013


Ответы (1)


В коде предполагается, что при создании экземпляра HighResolutionImage изображение загружается в память, даже если showImage() не вызывается.

Прокси гарантирует, что изображение загружается в память только при вызове showImage().

//load veryHighResPhoto1 to memory
Image highResolutionImageNoProxy1 = new HighResolutionImage("sample/veryHighResPhoto1.jpeg");
//load veryHighResPhoto2 to memory
Image highResolutionImageNoProxy2 = new HighResolutionImage("sample/veryHighResPhoto2.jpeg");
//load veryHighResPhoto3 to memory
Image highResolutionImageBoProxy3 = new HighResolutionImage("sample/veryHighResPhoto3.jpeg");

//load just the proxys (image not loaded yet)
Image highResolutionImage1 = new ImageProxy("sample/veryHighResPhoto1.jpeg");
Image highResolutionImage2 = new ImageProxy("sample/veryHighResPhoto2.jpeg");
Image highResolutionImage3 = new ImageProxy("sample/veryHighResPhoto3.jpeg");
//trigger the load of the image into memory
highResolutionImage1.showImage();
person Community    schedule 24.04.2013