【发布时间】:2015-01-20 19:43:38
【问题描述】:
我试图理解代理设计模式。但我无法理解代理设计模式的用法。我从维基百科得到这个代码示例
interface Image {
public void displayImage();
}
//on System A
class RealImage implements Image {
private String filename = null;
/**
* Constructor
* @param filename
*/
public RealImage(final String filename) {
this.filename = filename;
loadImageFromDisk();
}
/**
* Loads the image from the disk
*/
private void loadImageFromDisk() {
System.out.println("Loading " + filename);
}
/**
* Displays the image
*/
public void displayImage() {
System.out.println("Displaying " + filename);
}
}
//on System B
class ProxyImage implements Image {
private RealImage image = null;
private String filename = null;
/**
* Constructor
* @param filename
*/
public ProxyImage(final String filename) {
this.filename = filename;
}
/**
* Displays the image
*/
public void displayImage() {
if (image == null) {
image = new RealImage(filename);
}
image.displayImage();
}
}
class ProxyExample {
/**
* Test method
*/
public static void main(String[] args) {
final Image IMAGE1 = new ProxyImage("HiRes_10MB_Photo1");
final Image IMAGE2 = new ProxyImage("HiRes_10MB_Photo2");
IMAGE1.displayImage(); // loading necessary
IMAGE1.displayImage(); // loading unnecessary
IMAGE2.displayImage(); // loading necessary
IMAGE2.displayImage(); // loading unnecessary
IMAGE1.displayImage(); // loading unnecessary
}
}
在这个例子中,他们说第二次显示图像不需要加载。甚至可以直接访问 RealImage 对象。
final Image IMAGE1 = new RealImage("HiRes_10MB_Photo1");
final Image IMAGE2 = new RealImage("HiRes_10MB_Photo2");
IMAGE1.displayImage(); // loading necessary
IMAGE1.displayImage(); // loading unnecessary
IMAGE2.displayImage(); // loading necessary
IMAGE2.displayImage(); // loading unnecessary
IMAGE1.displayImage(); // loading unnecessary
我需要了解 ProxyImage 类在这个模式中的用法。
【问题讨论】:
-
你对哪一部分感到困惑?
-
这里他们使用 ProxyImage 的对象实例来显示图像而无需再次重新加载。如果我们也有 RealImage 的对象实例,我们可以归档同样的东西。为什么这被视为一种模式。
-
谨防维基百科上的模式示例。如果您想要 Java 中最常用的模式,Cay Horstmann's Object-oriented Design & Patterns 很好。该链接的页面上有源代码。
标签: java design-patterns