1. 概念
代理模式是一种结构型设计模式,其目的是通过引入一个代理对象来控制对另一个对象的访问。
在代理模式中,有三个主要角色:
- 抽象主题(Subject):声明了代理和真实主题之间的共同接口,这样代理对象可以替代真实主题。
- 真实主题(Real Subject):定义了代理所代表的真实对象。
- 代理(Proxy):保持一个引用,使得代理可以访问真实主题,并提供与真实主题相同的接口,以便可以替代真实主题。
类型
代理模式可以分为几种类型,包括:
- 远程代理(Remote Proxy):控制对远程对象的访问,即使这些对象位于不同的地址空间。
- 虚拟代理(Virtual Proxy):控制对创建开销大的资源的访问,直到真正需要它们。
- 保护代理(Protection Proxy):基于调用者的身份控制对对象的访问权限。
- 智能代理(Smart Proxy):在访问对象时执行额外的动作,例如对对象的引用计数或懒加载。
2. 示例
// 抽象主题
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 ProxyPatternExample {
public static void main(String[] args) {
Image image = new ProxyImage("test.jpg");
// 图像将从磁盘加载
image.display();
// 图像不需要从磁盘加载
image.display();
}
}
在上面的示例中,ProxyImage
充当了 RealImage
的代理。它会在需要时创建 RealImage
,并控制对 RealImage
对象的访问。第一次调用 display()
时,会实际加载图像,而后续调用将直接使用已加载的图像。