设计模式 - 代理模式
封面图
•
2026-03-28
•
设计模式
21
0
0
0
代理模式(Proxy Pattern)是一种**结构型设计模式**,它为其他对象提供一个代理以控制对这个对象的访问。代理模式通常用于在不修改原始对象的前提下,增强或控制对对象的访问。 --- ## 🧩 一、代理模式简介 ### 1.1 定义 代理模式为某个对象提供一个代理对象,由代理对象来控制对原对象的访问。通过代理对象,可以在不改变原对象的情况下,增加一些额外的功能,比如权限控制、延迟加载、日志记录等。 ### 1.2 结构图 ``` +----------------+ | Subject | +----------------+ | +-------------------+ | Proxy | +-------------------+ | +-------------------+ | RealSubject | +-------------------+ ``` - **Subject**:抽象接口,定义了真实对象和代理对象都必须实现的方法。 - **RealSubject**:真实主题类,实现具体的业务逻辑。 - **Proxy**:代理类,持有对真实主题的引用,并在调用真实主题之前或之后执行额外操作。 --- ## 🎯 二、代理模式的应用场景 1. **权限控制**:如访问某个资源前检查用户权限。 2. **延迟加载**:如图片加载时先加载缩略图,需要时再加载大图。 3. **远程访问**:如远程服务调用,代理可以封装网络通信。 4. **日志记录**:在方法调用前后添加日志。 5. **安全控制**:防止直接访问敏感对象。 --- ## 🔧 三、代理模式的实现方式 ### 3.1 静态代理(Static Proxy) ```java // 1. 抽象主题 interface Subject { void doSomething(); } // 2. 真实主题 class RealSubject implements Subject { @Override public void doSomething() { System.out.println("RealSubject doing something..."); } } // 3. 代理类 class Proxy implements Subject { private RealSubject realSubject; public Proxy() { this.realSubject = new RealSubject(); } @Override public void doSomething() { System.out.println("Before doSomething"); realSubject.doSomething(); System.out.println("After doSomething"); } } ``` ### 3.2 动态代理(Dynamic Proxy) Java 中使用 `java.lang.reflect.Proxy` 实现动态代理,适用于多个类的代理需求。 ```java import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; interface Service { void execute(); } class RealService implements Service { @Override public void execute() { System.out.println("Executing service..."); } } class DynamicProxyHandler implements InvocationHandler { private Object target; public DynamicProxyHandler(Object target) { this.target = target; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("Before method: " + method.getName()); Object result = method.invoke(target, args); System.out.println("After method: " + method.getName()); return result; } } public class Main { public static void main(String[] args) { Service realService = new RealService(); Service proxyService = (Service) Proxy.newProxyInstance( Service.class.getClassLoader(), new Class[]{Service.class}, new DynamicProxyHandler(realService) ); proxyService.execute(); } } ``` --- ## ✅ 四、代理模式的优点 - **职责清晰**:将核心业务与辅助功能解耦。 - **扩展性强**:无需修改原有代码即可增强功能。 - **控制访问**:可对对象的访问进行控制,如权限验证、日志等。 --- ## ❌ 五、代理模式的缺点 - **增加系统复杂度**:引入代理层会增加代码量和理解难度。 - **性能开销**:代理可能带来额外的调用开销。 --- ## 📌 六、代理模式与装饰器模式的区别 | 特性 | 代理模式 | 装饰器模式 | |--------------|-----------------------------------|-----------------------------------| | 目的 | 控制对对象的访问 | 动态地给对象添加职责 | | 是否有实际对象 | 代理可能没有实际对象(如远程代理) | 装饰器必须包装一个对象 | | 使用场景 | 权限控制、延迟加载、远程调用等 | 动态扩展功能 | --- ## 📘 七、总结 代理模式是**控制对对象的访问**的一种常用设计模式,尤其适合以下情况: - 需要对对象的访问进行控制; - 需要在不修改原对象的情况下增加功能; - 涉及远程调用、权限控制、延迟加载等场景。 如果你正在开发一个需要增强对象行为、控制访问或处理复杂逻辑的系统,代理模式是一个非常有用的工具。 --- 需要我帮你用某种语言(如 Java、Python、C#)实现一个具体例子吗?
上一篇:
设计模式 - 解释器模式
下一篇:
设计模式 - 责任链模式
标题录入,一次不能超过6条
留言
评论