设计模式 - 代理模式(Proxy Pattern)
介绍
代理模式是一种结构型设计模式,它为你提供了一个代理对象来控制对真实对象的访问。代理对象通常包含对真实对象的引用,这样它可以透明地传递请求到真实的对象。此外,代理对象也可以用来执行一些额外的工作,例如缓存、权限检查等。
实现
我们以一个图像加载器为例来展示代理模式的应用。假设我们需要在应用程序中加载大量的图像文件,为了减少内存消耗,我们希望在真正需要显示图像时才加载它。
定义主题接口
首先定义一个主题接口,它声明了所有代理和真实对象共有的方法。
interface Image {
void display();
}
创建真实主题类
然后创建一个真实主题类,它实现了 Image
接口,并提供了真实的图像加载逻辑。
class RealImage implements Image {
private final String filename;
public RealImage(String filename) {
this.filename = filename;
loadFromDisk(filename);
}
private void loadFromDisk(String filename) {
System.out.println("Loading image from disk: " + filename);
// Simulate loading time
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@Override
public void display() {
System.out.println("Displaying image: " + filename);
}
}
创建代理类
接着创建一个代理类,它也实现了 Image
接口,并持有对真实主题的引用。
class ImageProxy implements Image {
private RealImage realImage;
private final String filename;
public ImageProxy(String filename) {
this.filename = filename;
}
@Override
public void display() {
if (realImage == null) {
realImage = new RealImage(filename);
}
realImage.display();
}
}
使用代理模式
接下来,在主程序中使用代理模式来延迟加载图像。
public class ImageLoader {
public static void main(String[] args) {
Image image1 = new ImageProxy("image1.jpg");
Image image2 = new ImageProxy("image2.jpg");
// 第一次调用时,代理会加载图像
image1.display(); // 输出 "Loading image from disk: image1.jpg" 和 "Displaying image: image1.jpg"
// 第二次调用时,代理已经有了真实的图像对象,所以不会重新加载
image1.display(); // 输出 "Displaying image: image1.jpg"
// 加载第二个图像
image2.display(); // 输出 "Loading image from disk: image2.jpg" 和 "Displaying image: image2.jpg"
}
}
使用场景
代理模式适用于以下情况:
- 为了控制对一个对象的访问。
- 为了在访问一个对象时做一些额外的工作,如缓存、日志记录、权限验证等。
- 当创建一个对象的代价很高时,通过代理来延迟创建的时间。
总结
代理模式通过提供一个代理对象来控制对真实对象的访问,同时可以在访问真实对象前后执行一些额外的操作。这种方式不仅增强了代码的可维护性和可扩展性,还能有效地优化资源的使用,提高系统的性能。
以上就是代理模式的一个实现案例,希望这篇文章能帮助你理解代理模式的使用方式及其优势。
评论区