23种设计模式-11代理模式

代理模式

适合阅读本专栏的人群包括:

  • 想提升代码质量和架构思维的 Java 开发者
  • 在工作中面对复杂业务、代码难以维护的工程师
  • 想准备面试、系统复习设计模式知识的同学

阅读完本专栏,你将掌握:

  • 23 种设计模式的结构、适用场景和最佳实践
  • 面向对象六大设计原则的使用方式
  • 如何用设计模式解决常见业务场景问题
  • 如何重构低质量代码,提升扩展性与可维护性

任何问题都可以在留言区指出,作者看到后会第一时间回复。

概念总是生僻的,可以结合代码多体会多练习。

如果本文章给你带来一点点收获请点点赞支持一下,谢谢各位架构师,技术专家,专业大拿。

其他模式详解:设计模式入门

代理模式(Proxy Pattern )是一种结构型设计模式,它通过为其他对象提供一个代理,以控制对这个对象的访问。代理模式可以在不改变对象接口的情况下,为对象的操作加上额外的功能。

代理模式的优点

  1. 控制访问:可以控制对真实对象的访问,进行权限控制、访问控制等。
  2. 延迟初始化:可以在需要的时候才创建真实对象,节省资源。
  3. 日志记录:可以在访问真实对象前后进行日志记录。
  4. 远程代理:可以将请求转发到远程服务器上的真实对象。

适用场景

  • 远程代理(Remote Proxy): 代理对象可以隐藏原始对象存在于远程服务器上的事实,使得客户端可以透明地访问远程对象。这对于分布式系统非常有用。
  • 虚拟代理(Virtual Proxy): 当创建原始对象需要大量资源时,代理对象可以充当一个轻量级的替代品,延迟原始对象的实际创建和初始化,从而提高性能。
  • 保护代理(Protection Proxy): 代理对象可以控制对原始对象的访问权限,确保只有具有特定权限的客户端可以访问原始对象。
  • 缓存代理(Cache Proxy): 代理对象可以缓存原始对象的结果,以便在后续相同请求时能够直接返回缓存的结果,减少重复计算。
  • 日志记录代理(Logging Proxy): 代理对象可以在访问原始对象之前或之后记录日志,用于调试、监控或审计。

结构

  1. 接口(Subject):定义了代理类和真实类的共同接口。
  2. 真实类(RealSubject):实现了接口,定义了代理类实际代表的对象。
  3. 代理类(Proxy) :实现了接口,包含对真实类对象的引用,并在调用真实类的方法时提供额外的功能。

代码示例

以下是一个简单的代理模式示例,展示了如何使用代理类来控制对真实类的访问。

假设我们有一个图片查看器,图片文件可能很大,所以我们希望在真正需要显示图片时才加载它(延迟加载),从而提升性能。

java 复制代码
//1.接口
interface Image {
    void display();
}
//2.真实类
class RealImage implements Image {
    private String fileName;

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

    private void loadFromDisk() {
        System.out.println("Loading " + fileName);
    }

    @Override
    public void display() {
        System.out.println("Displaying " + fileName);
    }
}
//3.代理类
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();
    }
}
//4.客户端代码
public class ProxyPatternDemo {
    public static void main(String[] args) {
        Image image = new ProxyImage("test_image.jpg");

        // 在调用代理对象的 display 方法时才 真正创建 RealImage 对象,实现延迟加载
        image.display();
        System.out.println("");

    }
}

代理模式与装饰器模式区别

虽然代理模式与装饰器模式结构类似(都持有目标对象的引用),但适用场景完全不同:

  1. 意图不同(最核心)

    • 代理模式的核心是控制访问
    • 装饰器模式的核心是增强功能
  2. 对客户端的透明度不同

    • 代理看起来就像目标对象的"替身",行为尽量保持一致

    • 装饰器在不改变接口的情况下,突破性增加功能

  3. 使用方式不同

    • 代理一般不叠加(通常一个代理)

    • 装饰器天然支持链式套娃增强

相关推荐
AI人工智能+电脑小能手1 天前
大白话说Java设计模式-28-模板方法模式(业务实战篇)
java·设计模式·模板方法模式·spring源码·订单系统·代码复用
leeyi1 天前
两个 Agent 怎么协作:Host-Worker 模式(第91篇-E77)
设计模式·agent·ai编程
AI人工智能+电脑小能手2 天前
大白话说Java设计模式-26-策略模式(业务实战篇)
java·spring·设计模式·策略模式·支付系统·算法切换
星火10242 天前
【Groovy翻译-进阶篇】Groovy 中的设计模式
后端·设计模式·groovy
AI人工智能+电脑小能手2 天前
大白话说Java设计模式-27-策略模式(源码剖析篇)
java·spring·设计模式·策略模式·源码分析·事务管理·comparator
SL_staff2 天前
风控规则如何从硬编码解耦?我们在 JVS-Rules 中的实践与思考
java·spring boot·设计模式
小此方2 天前
Linux加餐(一):藏在Linux中的设计模式(一)策略模式与日志
linux·设计模式·策略模式
To_OC3 天前
从一行入口代码啃透 NestJS:工厂模式、装饰器和依赖注入是怎么串起来的
后端·设计模式·nestjs
东方小月3 天前
从零开发一个 Coding Agent(十二):实现版本化 JSONL 与真实 CLI 入口
前端·设计模式·前端框架
程序员贺加贝3 天前
轻制造SaaS的生产闭环建模-BOM工单领料报工质检与入库
java·设计模式·架构