设计模式——代理模式

代理模式(Proxy Pattern)是一种结构型设计模式,它为其他对象提供一个代理以控制对这个对象的访问。代理对象在客户端和目标对象之间起到中介作用,可以添加额外的功能或限制对目标对象的直接访问。

原理

  • 抽象主题(Subject Interface): 定义了目标对象和代理对象共有的接口。
  • 具体主题(Real Subject): 目标类实现抽象主题接口,包含了实际业务逻辑。
  • 代理(Proxy): 也实现了抽象主题接口,并持有对真实主题的引用。代理对象在执行业务方法时可以选择调用真实主题的方法,或者在调用前后增加额外操作。

Java代码示例(使用代理模式实现翻译服务)

java 复制代码
// 抽象主题接口
public interface Translator {
    void translate(String text);
}

// 具体主题:真正的翻译服务
public class ChineseTranslator implements Translator {
    @Override
    public void translate(String text) {
        System.out.println("Translating from English to Chinese: " + text);
        // 实际的翻译逻辑...
    }
}

// 代理类:添加额外功能,比如日志记录
public class LoggingTranslator implements Translator {
    private final Translator realTranslator;

    public LoggingTranslator(Translator translator) {
        this.realTranslator = translator;
    }

    @Override
    public void translate(String text) {
        System.out.println("Logging translation request...");
        realTranslator.translate(text);
        System.out.println("Finished logging.");
    }
}

// 客户端
public class Client {
    public static void main(String[] args) {
        // 创建真实对象
        Translator realTranslator = new ChineseTranslator();
        
        // 创建代理对象,传递真实对象
        Translator proxyTranslator = new LoggingTranslator(realTranslator);

        // 客户端使用代理对象进行翻译
        proxyTranslator.translate("Hello, world!");
    }
}

想象你正在经营一家咖啡店,顾客通常会直接向服务员点单。这时,服务员就是咖啡师的代理,他们接收顾客的订单并将之传递给咖啡师制作。同时,服务员还可以在这个过程中做额外的事情,比如记录订单信息、确认库存等。这就是代理模式的一个简化示例:服务员就像是咖啡师的代理,负责管控对咖啡师服务的访问,并在必要时扩展附加功能。

应用场景

  • 访问控制:如权限验证、日志记录等,在执行实际业务逻辑之前先进行必要的前置处理。
  • 远程代理:通过网络调用远程对象的方法,隐藏底层通信细节。
  • 缓存代理:在请求实际对象前先检查缓存中是否存在结果,如果存在则直接返回,否则才调用真实对象并缓存结果。
  • 智能引用:如大图加载时先显示低质量的预览图,待高分辨率图片加载完成后再替换。
  • 阻止直接访问敏感对象:例如数据库连接池,每次都是从池子中获取已初始化好的连接,而不是每次都创建新的连接。

适用性

  • 当需要为原对象增加额外功能,如事务管理、日志记录、权限控制等而又不想修改原对象时。
  • 需要控制或延迟对真实对象的访问,如懒加载、资源池等。
  • 需要透明地为真实对象的操作提供增强时。
相关推荐
To_OC1 小时前
从一行入口代码啃透 NestJS:工厂模式、装饰器和依赖注入是怎么串起来的
后端·设计模式·nestjs
东方小月4 小时前
从零开发一个 Coding Agent(十二):实现版本化 JSONL 与真实 CLI 入口
前端·设计模式·前端框架
程序员贺加贝5 小时前
轻制造SaaS的生产闭环建模-BOM工单领料报工质检与入库
java·设计模式·架构
嘟嘟07177 小时前
SDD 规范驱动开发:从 vibe coding 崩盘到"两次创造"
设计模式·代码规范·vibecoding
无凭9 小时前
拆解 DeerFlow Memory:Agent 的长期记忆到底怎么做?
人工智能·设计模式
AI大法师12 小时前
品牌焕新不只换 Logo:捷豹案例里的触点重构方法
大数据·人工智能·设计模式·新媒体运营
AI人工智能+电脑小能手1 天前
大白话说Java设计模式-23-桥接模式(源码剖析篇)
java·设计模式·jdbc·桥接模式·源码分析·awt·java logging
嘟嘟07172 天前
TypeScript 工具类型通关:Pick、Omit、Partial、Record 区别与 Omit 等价实现一次讲清
设计模式·面试·typescript
SL_staff2 天前
中小离散制造如何用工艺路线模板解决‘人走流程丢’——JVS-APS 实践解析
java·设计模式·全栈
Asize2 天前
3 种设计模式 + DI:Nest.js 后端第一课
后端·设计模式·nestjs