在Java中,代理模式是一种结构型设计模式,它允许你提供一个代理或者占位符,以控制对其他对象的访问。
代理模式的角色和类型
-
抽象主题(Subject):
- 定义了真实主题和代理类共同实现的接口或抽象类。在Java中可以用接口或者抽象类来定义。
-
真实主题(Real Subject):
- 实现了抽象主题定义的接口,是代理模式中实际承担业务逻辑的类。
-
代理(Proxy):
- 持有对真实主题的引用,在其自身实现接口的方法中,可以调用真实主题的方法,或者在调用前后执行额外的操作。
示例
下面通过一个简单的示例来说明代理模式的使用:
抽象主题接口
// 抽象主题接口
interface Image {
void display();
}
真实主题类
// 真实主题类
class RealImage implements Image {
private String filename;
public RealImage(String filename) {
this.filename = filename;
loadFromDisk(filename);
}
private void loadFromDisk(String filename) {
System.out.println("Loading " + filename);
}
@Override
public void display() {
System.out.println("Displaying " + 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();
}
}
解释
-
抽象主题接口
Image
:定义了display()
方法,是真实主题RealImage
和代理ProxyImage
都要实现的接口。 -
真实主题
RealImage
:实现了Image
接口,处理实际的图片加载和显示。 -
代理
ProxyImage
:也实现了Image
接口,并持有一个真实主题的引用RealImage
。在display()
方法中,如果真实主题尚未被实例化,会首先实例化并调用其display()
方法,从而完成图片的加载和显示。 -
客户端
ProxyPatternDemo
:演示了如何通过代理模式控制对真实主题的访问,首次访问时加载图片,后续再次访问时直接显示已加载的图片,而无需重新加载。
代理模式的优点包括:
- 远程代理:为一个对象在不同的地址空间提供局部代表。
- 虚拟代理:根据需要创建开销很大的对象。
- 保护代理:控制对原始对象的访问。
这种模式在Java中广泛应用,例如网络连接代理、安全代理、缓存代理等。
文章评论