在日常開發中,我們常遇到這樣的場景:需要控制對象訪問權限、優化高成本操作,或給方法添加額外功能(如日志、事務)。
代理模式(Proxy Pattern)?正是解決這類問題的金鑰匙。作為結構型設計模式的代表,它在不改變原始類的前提下,提供了對象訪問的中間層控制。
一、代理模式能做什么?
通過真實案例理解其價值:
權限控制
律師代理當事人處理法律事務,限制敏感操作
性能優化
圖片代理延遲加載大文件,減少系統開銷
功能增強
給數據庫操作自動添加事務管理
// 經典代理實現示例
public class ImageProxy implements Image {private RealImage realImage;@Overridepublic void display() {if (realImage == null) {realImage = new RealImage("large_photo.jpg"); // 按需加載}realImage.display();}
}
二、四種實戰代理類型解析
靜態代理
手動編寫代理類,適合簡單場景
// 安全代理案例:控制文件操作權限 public void deleteFile(String filename) {if ("admin".equals(user.getRole())) {realService.deleteFile(filename);?} else {throw new SecurityException("權限不足");} }
動態代理(重點推薦)
JDK動態代理無需硬編碼,運行時動態生成:
// 日志增強動態代理 public Object invoke(Object proxy, Method method, Object[] args) {System.out.println("[LOG] 執行方法: " + method.getName());return method.invoke(target, args); }
虛擬代理
延遲初始化大對象,顯著提升啟動速度
// 虛擬代理實現 public void doSomething() {if (realObject == null) {realObject = new HeavyObject(); // 首次使用時創建}realObject.process(); }
遠程代理
封裝網絡通信細節,實現透明遠程調用
三、企業級應用場景
Spring AOP
基于動態代理實現聲明式事務
MyBatis延遲加載
虛擬代理優化數據庫查詢
RPC框架
遠程代理屏蔽網絡調用復雜度
四、避坑指南
代理 vs 裝飾器
代理側重訪問控制(如權限校驗)
裝飾器側重功能疊加(如多重加密)
性能陷阱
動態代理比直接調用慢約3-5倍,高頻場景需謹慎
五、最佳實踐建議
優先使用JDK動態代理(基于接口)
復雜類選擇CGLIB代理(基于繼承)
敏感操作務必添加保護代理
高并發場景采用同步代理
原創實踐心得:在電商訂單系統中,我們通過動態代理+緩存代理組合方案,將支付接口響應速度提升40%。關鍵是在代理層合理平衡功能擴展與性能損耗。
推薦配套資源
為幫助大家掌握動態代理實現精髓,
筆者整理了一套實戰視頻:https://pan.quark.cn/s/ce0fcc491796
包含:JDK/CGLIB源碼剖析 + Spring AOP落地實現 + 性能調優方案