设计模式——代理模式

代理模式 (Proxy Pattern)

什么是代理模式?

代理模式是一种结构型设计模式,它允许你提供一个代理或占位符来控制对另一个对象的访问。

简单来说:代理模式就是给对象找一个"代理人",通过代理来访问对象。

生活中的例子

想象一下:

  • 明星经纪人:经纪人代理明星处理事务
  • 房产中介:中介代理房东出租房屋
  • VPN:VPN代理访问国外网站

为什么需要代理模式?

传统方式的问题

java 复制代码
// 直接访问对象
RealObject object = new RealObject();
object.doSomething();

问题:

  1. 无法控制:无法控制对对象的访问
  2. 无法增强:无法在访问前后添加额外逻辑
  3. 无法保护:无法保护对象不被直接访问

代理模式的优势

java 复制代码
// 通过代理访问对象
Proxy proxy = new Proxy(new RealObject());
proxy.doSomething();

优势:

  1. 控制访问:可以控制对对象的访问
  2. 增强功能:可以在访问前后添加额外逻辑
  3. 保护对象:可以保护对象不被直接访问

代理模式的结构

复制代码
┌─────────────────────┐
│      Subject        │  主题接口
├─────────────────────┤
│ + request(): void   │
└──────────┬──────────┘
           │ 实现
           ├──┬──────────────────┬──────────────┐
           │                    │              │
┌──────────┴──────┐  ┌───────────┴───────┐  ┌───┴────────┐
│   RealSubject   │  │      Proxy        │  │ ...       │
├─────────────────┤  ├───────────────────┤  ├────────────┤
│ + request()     │  │ - realSubject: RS │  │            │
└─────────────────┘  │ + request()       │  │            │
                     └───────────────────┘  └────────────┘

代码示例

1. 定义主题接口

java 复制代码
public interface Subject {
    void request();
}

2. 定义真实主题

java 复制代码
public class RealSubject implements Subject {
    @Override
    public void request() {
        System.out.println("真实主题处理请求");
    }
}

3. 定义代理

java 复制代码
public class Proxy implements Subject {
    private RealSubject realSubject;
    
    @Override
    public void request() {
        if (realSubject == null) {
            realSubject = new RealSubject();
        }
        
        System.out.println("代理:请求前处理");
        realSubject.request();
        System.out.println("代理:请求后处理");
    }
}

4. 使用代理

java 复制代码
public class Client {
    public static void main(String[] args) {
        Subject proxy = new Proxy();
        proxy.request();
    }
}

代理模式的类型

1. 远程代理

代理远程对象,隐藏网络细节。

2. 虚拟代理

延迟加载对象,只有在需要时才创建。

3. 保护代理

控制对对象的访问,提供权限控制。

4. 智能代理

在访问对象时添加额外逻辑,如引用计数、日志记录等。

代理模式的优点

  1. 控制访问:可以控制对对象的访问
  2. 增强功能:可以在访问前后添加额外逻辑
  3. 保护对象:可以保护对象不被直接访问
  4. 延迟加载:可以延迟加载对象

代理模式的缺点

  1. 增加复杂度:引入了额外的类
  2. 性能开销:多了一层调用

适用场景

  1. 控制访问:需要控制对对象的访问
  2. 延迟加载:需要延迟加载对象
  3. 远程访问:需要访问远程对象
  4. 权限控制:需要控制访问权限

常见应用场景

  • RPC调用:远程过程调用
  • 缓存:缓存代理
  • 权限控制:权限控制代理
  • AOP:面向切面编程

使用建议

  • 控制访问:使用代理模式
  • 延迟加载:使用代理模式
  • 直接访问:直接使用即可

注意事项

⚠️ 代理模式虽然有用,但要注意:

  • 不要过度使用,增加不必要的复杂度
  • 考虑使用动态代理
相关推荐
zzu123zsw1 天前
业务拆分后的治理深水区:解构企业级微服务六大核心设计模式与高可用落真实践
微服务·设计模式·架构·高可用·微服务架构设计
牧瀬クリスだ1 天前
观察者模式:一个对象变化,一群对象自动响应
java·观察者模式·设计模式
拆房老料1 天前
【第四部分:Agentic 智能体设计模式】16. 一个 Prompt 搞不定复杂任务?试试 Prompt Chaining
java·前端·人工智能·设计模式·prompt
MobotStone2 天前
AI 写代码越来越爽,但程序员可能越来越废了
人工智能·设计模式
墨子夕2 天前
设计模式——Java × Python 双语言精讲 · 23 个经典模式 + 现代演进(前言篇)
java·开发语言·设计模式
墨子夕2 天前
设计模式——Java × Python 双语言精讲 · 23 个经典模式 + 现代演进(第一篇)
java·python·设计模式
General_G2 天前
创建型模式—原型(Prototype)模式
c++·设计模式·原型模式
geovindu2 天前
rust: Template Method Pattern
开发语言·后端·设计模式·rust·行为模式·模板方法模
AI_Cloud_推荐2 天前
DeepSeek-V4-Pro 的 4.5 和 12:不是加价,是同名不同版本
阿里云·语言模型·代理模式·ai编程·百度云
geovindu2 天前
rust: Template Method Pattern(续)
开发语言·后端·设计模式·rust·行为模式·板方法模式