Java 代理模式(Proxy Pattern)详解
🧭 什么是代理模式?
代理模式是结构型设计模式之一,为其他对象提供一个代理以控制对这个对象的访问。
就像生活中的“经纪人”,你无法直接联系明星,但可以通过代理来安排见面或业务。
🧠 使用场景
- 控制对象访问(权限控制)
- 延迟加载(虚拟代理)
- 远程代理(调用远程服务)
- 增强原始对象功能(如日志、事务)
🏗️ 模式结构
- Subject(抽象主题):定义代理与真实对象的公共接口
- RealSubject(真实主题):实际执行操作的对象
- Proxy(代理对象):控制对真实对象的访问
✅ 示例:上网代理
抽象接口
public interface Internet {void access(String site);
}
真实主题
public class RealInternet implements Internet {@Overridepublic void access(String site) {System.out.println("访问网站: " + site);}
}
代理类:禁止访问黑名单网站
import java.util.Arrays;
import java.util.List;public class InternetProxy implements Internet {private Internet realInternet = new RealInternet();private List<String> bannedSites = Arrays.asList("facebook.com", "youtube.com");@Overridepublic void access(String site) {if (bannedSites.contains(site)) {System.out.println("访问被禁止:" + site);} else {realInternet.access(site);}}
}
客户端调用
public class Main {public static void main(String[] args) {Internet internet = new InternetProxy();internet.access("google.com");internet.access("facebook.com");}
}
🧩 优点
- 控制对象访问权限,保护真实对象
- 降低系统耦合度,增强灵活性
- 可扩展真实对象的功能(如添加日志、安全控制)
⚠️ 缺点
- 增加系统类的数量
- 部分代理模式可能引入性能开销
🍭 常见实现
- 静态代理:手动写代理类,上例就是静态代理。
- 动态代理(JDK Proxy):运行时生成代理类,接口必须存在。
- CGLIB 代理:用于没有接口的类,通过继承实现代理。
✅ 使用建议
适合用在:
- 安全控制(如登录验证)
- 缓存或延迟加载(如图片加载)
- 远程调用(如 RPC、RMI)
- 日志、事务等功能增强