设计模式 12:代理模式
定义与目的
- 定义:代理模式提供一个代理对象来控制对一个对象的访问。代理对象通常拥有与实际对象相同的接口,使得客户端代码可以透明地使用代理对象。
- 目的:该模式的主要目的是控制对一个对象的访问,以及在访问之前或之后执行某些操作。
实现示例
假设我们有一个昂贵的图像加载操作,我们希望延迟加载直到真正需要显示时才加载图像。我们可以使用代理模式来实现这个需求。
java
// 接口 - 图像
interface Image {
void display();
}
// 实际主题 - 真实图像
class RealImage implements Image {
private final String filename;
public RealImage(String filename) {
this.filename = filename;
loadFromDisk();
}
private void loadFromDisk() {
System.out.println("Loading image: " + filename);
}
@Override
public void display() {
System.out.println("Displaying image: " + filename);
}
}
// 代理主题
class ProxyImage implements Image {
private RealImage realImage;
private final String filename;
public ProxyImage(String filename) {
this.filename = filename;
}
@Override
public void display() {
if (realImage == null) {
realImage = new RealImage(filename); // 创建 RealImage 实例并加载图像
}
realImage.display(); // 显示图像
}
}
// 客户端代码
public class Client {
public static void main(String[] args) {
// RealImage 创建时即加载图像,而ProxyImage不会在创建时加载图像
Image proxyImage = new ProxyImage("image.png");
// 在这里调用display()时,实际的图像将被加载并显示
proxyImage.display(); // 输出: Loading image: image.png
// Displaying image: image.png
}
}
使用场景
- 当你需要控制对一个对象的访问时。
- 当你需要在访问一个对象前后执行某些操作时,例如缓存、权限检查、日志记录等。
- 当创建一个对象的成本较高时,可以通过代理对象来延迟创建或共享实际对象。
代理模式通过提供一个代理对象来控制对实际对象的访问,这对于需要在访问对象前后执行额外操作的场景非常有用。
小结
代理模式是一种常用的结构型模式,它有助于控制对一个对象的访问,并在访问前后执行某些操作。这对于需要增加额外功能而又不想修改现有类的情况非常有用。