代理模式是一种结构型设计模式,它允许通过代理对象控制对另一个对象的访问。代理对象充当客户端和实际对象之间的中介,隐藏了实际对象的复杂性。
下面是一个简单的代理模式示例,其中代理对象控制对实际对象的访问:
// 定义一个接口 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()方法。这样,代理对象可以控制对实际对象的访问,并在必要时延迟实际对象的创建。