代理模式是一种结构型设计模式,它允许通过代理对象控制对另一个对象的访问。代理对象充当客户端和实际对象之间的中介,隐藏了实际对象的复杂性。
下面是一个简单的代理模式示例,其中代理对象控制对实际对象的访问:
// 定义一个接口
interface Image {
void display();
}
// 实际对象
class RealImage implements Image {
private String fileName;
public RealImage(String fileName) {
this.fileName = fileName;
loadFromDisk(fileName);
}
@Override
public void display() {
System.out.println("Displaying " + fileName);
}
private void loadFromDisk(String fileName) {
System.out.println("Loading " + fileName);
}
}
// 代理对象
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();
}
}
// 使用代理对象
public class ProxyPatternDemo {
public static void main(String[] args) {
Image image = new ProxyImage("test.jpg");
// 图像将从磁盘加载
image.display();
System.out.println("");
// 图像不需要从磁盘加载
image.display();
}
}在上面的示例中,RealImage是实际对象,ProxyImage是代理对象。当客户端调用display()方法时,代理对象首先检查是否已经创建了实际对象。如果没有,它将创建一个新的实际对象并调用其display()方法。如果已经创建了实际对象,则直接调用其display()方法。这样,代理对象可以控制对实际对象的访问,并在必要时延迟实际对象的创建。