代理模式的Java例子
下面是一个用Java写的代理模式的例子:
首先,定义一个接口Image
,表示图像的操作:
public interface Image {
void display();
}
然后,实现该接口的具体类RealImage
,表示真实的图像操作:
public class RealImage implements Image {
private String filename;
public RealImage(String filename) {
this.filename = filename;
loadImageFromDisk();
}
private void loadImageFromDisk() {
System.out.println("Loading image from disk: " + filename);
}
@Override
public void display() {
System.out.println("Displaying image: " + filename);
}
}
接下来,定义一个代理类ProxyImage
,用于控制对真实图像的访问:
public class ProxyImage implements Image {
private String filename;
private RealImage realImage;
public ProxyImage(String filename) {
this.filename = filename;
}
@Override
public void display() {
if (realImage == null) {
realImage = new RealImage(filename);
}
realImage.display();
}
}
最后,在客户端中使用代理模式:
public class Client {
public static void main(String[] args) {
Image image1 = new ProxyImage("image1.jpg");
Image image2 = new ProxyImage("image2.jpg");
// 图像1的加载和显示
image1.display();
// 图像2的加载和显示
image2.display();
// 图像1已经加载过,直接显示
image1.display();
}
}
输出结果:
Loading image from disk: image1.jpg
Displaying image: image1.jpg
Loading image from disk: image2.jpg
Displaying image: image2.jpg
Displaying image: image1.jpg
在这个例子中,RealImage
表示真实的图像操作,ProxyImage
作为代理类控制对RealImage
的访问。
当需要显示图像时,如果图像还没有加载,则由ProxyImage
负责加载图像,然后通过RealImage
显示图像。如果图像已经加载过,ProxyImage
直接调用RealImage
显示图像,避免了重复加载。