代理模式(Proxy Pattern)详解:以延迟加载图片为例

在日常开发中,是否遇到过以下问题:

"程序启动时图片太多,加载太慢!"

"用户还没看到图片就已经开始加载了,性能浪费!"

此时,代理模式(Proxy Pattern)便派上了用场。本文将以一个图形界面中"延迟加载图片"的经典例子,讲解代理模式的核心思想与实际应用。

什么是代理模式?

代理模式为其他对象提供一种代理以控制对这个对象的访问。常见的几种代理有:

  • 虚拟代理:根据需要创建开销大的对象(比如图片加载)。

  • 保护代理:控制访问权限。

  • 远程代理:为不同地址空间的对象提供局部代表。

示例场景:图片延迟加载

设想你有一个图形界面需要显示大量图片,但你不希望一开始就加载全部资源,而是当用户真正滑动到该图片位置时再加载。(延迟加载 (Lazy Loading)指的是:等到真正需要某个对象或资源时,才去创建或加载它,从而节省资源或提升启动速度。)

这就非常适合使用"虚拟代理"来优化性能。

系统的框图​​​​​​​

简单代码结构解析

html 复制代码
com.Proxy_Pattern
│
├── Image.java        // 抽象主题接口
├── RealImage.java    // 真实主题类
├── ProxyImage.java   // 代理类
└── Test.java         // 客户端测试类

抽象接口:Image.java

java 复制代码
public interface Image {
    void display();
}

定义一个图片的通用接口,所有图片类都必须实现该方法。

真实类:RealImage.java

java 复制代码
public class RealImage implements Image {
    private String filename;

    public RealImage(String filename) {
        this.filename = filename;
        loadFromDisk();
    }

    private void loadFromDisk() {
        System.out.println("加载图片:" + filename);
    }

    public void display() {
        System.out.println("显示图片:" + filename);
    }
}

这个类表示真正的图片加载逻辑。构造函数中会加载图片文件,相对开销较大。

代理类:ProxyImage.java

java 复制代码
public class ProxyImage implements Image {
    private String filename;
    private RealImage realImage;

    public ProxyImage(String filename) {
        this.filename = filename;
    }

    public void display() {
        if (realImage == null) {
            realImage = new RealImage(filename);  // 延迟加载
        }
        realImage.display();
    }
}

该类是代理对象,延迟创建真正的 RealImage 实例 。只有在第一次调用 display() 时,才会触发真实的图片加载。

测试代码:Test.java

java 复制代码
public class Test {
    public static void main(String[] args) {
        Image image = new ProxyImage("cat.jpg");

        System.out.println("第一次调用:");
        image.display();  // 第一次加载并显示

        System.out.println("第二次调用:");
        image.display();  // 直接显示(无需再加载)
    }
}

输出实例

从输出结果可以看到,图片只在第一次显示时被加载,第二次就直接显示,无需重新加载,达到了"懒加载"的效果。

优势总结

特点 描述
延迟加载 图片只在真正需要时才创建,节省资源
隐藏细节 客户端无需关心加载逻辑,只调用 display() 即可
易扩展 可在代理中添加缓存、权限控制、日志记录等功能

使用场景总结

你可以在以下场景中考虑使用代理模式:

  • 图像、视频、音频的懒加载

  • 远程调用接口的延迟访问

  • 安全控制,如保护资源的访问

  • 对资源访问进行监控或统计

代理模式提供了一种在不修改原有类的前提下,增强功能的优雅方式。通过引入代理对象,我们实现了图片的延迟加载,大大提升了程序的性能和响应速度。

相关推荐
Joy T3 小时前
Agent 确定性上下文设计:从 Prompt 参数注入到能力分层
java·开发语言·微服务·架构·prompt·agent context
m0_587383006 小时前
广州 24 小时自助健身房解决方案技术实现与实战指南
java·spring·小程序·架构·需求分析
·云扬·6 小时前
Prompt 工程与安全:从 System 设计到注入防御
java·人工智能·安全·ai·prompt
代码不停7 小时前
自动化测试(java)
java·开发语言·selenium·自动化
鬼手点金9 小时前
opencode-rules 插件
java·开发语言·前端·人工智能·chrome·git·github
paopaokaka_luck10 小时前
滑雪场管理系统(AI智能助手流式对话,ECharts 运营数据分析、教练、雪具与场地一体化预约,钱包支付退款、订单核销与服务评价)
java·人工智能·spring boot·网络协议·数据分析·echarts
Wang's Blog10 小时前
Java 项目实战: 交友项目 - Dubbo 的内部结构与一次调用的完整链路
java·dubbo
Wang's Blog10 小时前
Java 项目实战: 交友项目 - Dubbo 入门引导
java·dubbo·交友
蜗牛互联网11 小时前
Python Agent工具调用的白名单、参数校验与审批门禁
java·服务器·前端·人工智能·后端·python
SL_staff11 小时前
当规则引擎开始‘懂业务’:JVS-Rules金融风控四大原生能力拆解
java·python·全栈