2013-04-24 6 views
1

Я просматриваю образец кода, который объясняет шаблон прокси. Вот код:Прокси-шаблон - Загрузка в память

/** 
* 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(); , Может ли кто-нибудь объяснить это?

Благодаря

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

+1

да, ваша правка право :-) –

ответ

2

Код предполагает, что при создании экземпляра 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(); 
+0

Да, я прямо я просто заметил. спасибо – yrazlik

Смежные вопросы