深入理解設計模式之代理模式

深入理解設計模式之:代理模式

一、什么是代理模式?

代理模式(Proxy Pattern)是一種結構型設計模式。它為其他對象提供一種代理以控制對這個對象的訪問。代理對象在客戶端和目標對象之間起到中介作用,可以在不改變目標對象的前提下,增強或控制對目標對象的訪問。


二、代理模式的應用場景

  • 權限控制:如用戶訪問權限校驗
  • 延遲加載:如大對象的懶加載
  • 遠程代理:如RPC、RMI
  • 日志記錄:如方法調用日志
  • 緩存代理:如結果緩存
  • 防火墻代理:如網絡請求過濾

三、代理模式的分類

  1. 靜態代理
    代理類在編譯時就已經確定,代碼量較大,靈活性較差。

  2. 動態代理
    代理類在運行時動態生成,Java 中常用 JDK 動態代理和 CGLIB 動態代理。


四、代理模式的結構

  • Subject(抽象主題):定義目標對象和代理對象的共同接口
  • RealSubject(真實主題):實現了 Subject 的真實對象
  • Proxy(代理對象):實現了 Subject,內部持有 RealSubject 的引用

五、靜態代理實現示例(Java)

1. 定義接口

public interface UserService {void login(String username, String password);
}

2. 實現真實主題

public class UserServiceImpl implements UserService {@Overridepublic void login(String username, String password) {System.out.println(username + " 登錄系統,密碼:" + password);}
}

3. 實現代理類

public class UserServiceProxy implements UserService {private UserService realService;public UserServiceProxy(UserService realService) {this.realService = realService;}@Overridepublic void login(String username, String password) {// 代理增強:如權限校驗、日志System.out.println("【代理】開始登錄校驗...");realService.login(username, password);System.out.println("【代理】登錄操作已記錄日志。");}
}

4. 客戶端調用

public class Main {public static void main(String[] args) {UserService realService = new UserServiceImpl();UserService proxy = new UserServiceProxy(realService);proxy.login("Tom", "123456");}
}

輸出結果:

【代理】開始登錄校驗...
Tom 登錄系統,密碼:123456
【代理】登錄操作已記錄日志。

六、JDK 動態代理實現示例

1. 定義接口和真實主題(同上)

2. 創建動態代理處理器

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;public class UserServiceInvocationHandler implements InvocationHandler {private Object target;public UserServiceInvocationHandler(Object target) {this.target = target;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("【動態代理】方法調用前...");Object result = method.invoke(target, args);System.out.println("【動態代理】方法調用后...");return result;}
}

3. 客戶端調用

public class Main {public static void main(String[] args) {UserService realService = new UserServiceImpl();UserService proxy = (UserService) Proxy.newProxyInstance(realService.getClass().getClassLoader(),realService.getClass().getInterfaces(),new UserServiceInvocationHandler(realService));proxy.login("Alice", "password");}
}

輸出結果:

【動態代理】方法調用前...
Alice 登錄系統,密碼:password
【動態代理】方法調用后...

七、代理模式的優缺點

優點:

  • 職責清晰,擴展性好
  • 可以在不修改目標對象的前提下增強功能
  • 控制對象訪問,保護目標對象

缺點:

  • 增加系統復雜度
  • 靜態代理類過多,維護成本高
  • 動態代理對理解和調試有一定門檻

八、總結

代理模式是實際開發中非常常用的設計模式,Spring AOP、MyBatis Mapper、RPC 框架等都大量用到代理思想。掌握代理模式有助于理解 Java 動態代理、AOP 等高級特性。

建議:

  • 簡單增強可用靜態代理,復雜場景優先用動態代理
  • 結合實際業務場景選擇合適的代理方式

如需更多設計模式講解或源碼分析,歡迎留言交流!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/85362.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/85362.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/85362.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Ubuntu設置之初始化

安裝SSH服務 # 安裝 OpenSSH Server sudo apt update sudo apt install -y openssh-server# 檢查 SSH 服務狀態 sudo systemctl status ssh # Active: active (running) since Sat 2025-05-31 17:13:07 CST; 6s ago# 重啟服務 sudo systemctl restart ssh自定義分辨率 新…

【仿生機器人】極具前瞻性的架構——認知-情感-記憶“三位一體的仿生機器人系統架構

基于您的深度需求分析,我將為您設計一個全新的"認知-情感-記憶"三位一體的仿生機器人系統架構。以下是經過深度優化的解決方案: 一、核心架構升級(三體認知架構) 采用量子糾纏式架構設計: 認知三角&#xf…

Python量化交易12——Tushare全面獲取各種經濟金融數據

兩年前寫過Tushare的簡單使用: Python量化交易08——利用Tushare獲取日K數據_skshare- 現在更新一下吧,這兩年用過不少的金融數據庫,akshare,baostock,雅虎的,pd自帶的......發現還是Tushare最穩定最好用&…

python打卡day39@浙大疏錦行

知識點回顧 圖像數據的格式:灰度和彩色數據模型的定義顯存占用的4種地方 模型參數梯度參數優化器參數數據批量所占顯存神經元輸出中間狀態 batchisize和訓練的關系 1. 圖像數據格式 - 灰度圖像 :單通道,像素值范圍通常0-255,形狀為…

源碼解析(二):nnUNet

原文 😀 nnU-Net 是一個用于生物醫學圖像分割的自配置深度學習框架,可自動適應不同的數據集。可用于處理和訓練可能規模龐大的二維和三維醫學圖像。該系統分析數據集屬性并配置優化的基于 U-Net 的分割流程,無需手動參數調整或深度學習專業知…

clickhouse如何查看操作記錄,從日志來查看寫入是否成功

背景 插入表數據后,因為原本表中就有數據,一時間沒想到怎么查看插入是否成功,因為對數據源沒有很多的了解,這時候就想怎么查看下插入是否成功呢,于是就有了以下方法 具體方法 根據操作類型查找,比如inse…

udp 傳輸實時性測量

UDP(用戶數據報協議)是一種無連接的傳輸協議,適用于實時性要求較高的應用,如視頻流、音頻傳輸和游戲等。測量UDP傳輸的實時性可以通過多種工具和方法實現,以下是一些常見的方法和工具: 1. 使用 iperf 測試…

pikachu通關教程- over permission

如果使用A用戶的權限去操作B用戶的數據,A的權限小于B的權限,如果能夠成功操作,則稱之為越權操作。 越權漏洞形成的原因是后臺使用了 不合理的權限校驗規則導致的。 水平越權 當我們以Lucy賬號登錄,查詢個人信息時,會有…

nc 命令示例

nc -zv 實用示例 示例 1:測試單個 TCP 端口(最常見) 目標: 檢查主機 webserver.example.com 上的 80 端口 (HTTP) 是否開放。 nc -zv webserver.example.com 80成功輸出: Connection to webserver.example.com (19…

Redis是什么

注:本人不懂Redis是什么,問的大模型,讓它用生動淺顯的語言向我解釋。為了防止忘記,我把它說的記錄下來。接下來的解釋都是大模型生成的,如果有錯誤的地方歡迎指正 。 Redis 是什么?(一句話解釋&…

CVE-2021-28164源碼分析與漏洞復現

漏洞概述 漏洞名稱:Jetty 路徑解析邏輯漏洞導致 WEB-INF 敏感信息泄露 漏洞編號:CVE-2021-28164 CVSS 評分:7.5 影響版本:Jetty 9.4.37 - 9.4.38 修復版本:Jetty ≥ 9.4.39 漏洞類型:路徑遍歷/信息泄露 C…

顛覆傳統!單樣本熵最小化如何重塑大語言模型訓練范式?

顛覆傳統!單樣本熵最小化如何重塑大語言模型訓練范式? 大語言模型(LLM)的訓練往往依賴大量標注數據與復雜獎勵設計,但最新研究發現,僅用1條無標注數據和10步優化的熵最小化(EM)方法…

自動駕駛系統研發系列—激光雷達感知延遲:自動駕駛安全的隱形隱患?

???? 歡迎來到我的技術小筑,一個專為技術探索者打造的交流空間。在這里,我們不僅分享代碼的智慧,還探討技術的深度與廣度。無論您是資深開發者還是技術新手,這里都有一片屬于您的天空。讓我們在知識的海洋中一起航行,共同成長,探索技術的無限可能。 ?? 探索專欄:學…

【MySQL】事務及隔離性

目錄 一、什么是事務 (一)概念 (二)事務的四大屬性 (三)事務的作用 (四)事務的提交方式 二、事務的啟動、回滾與提交 (一)事務的啟動、回滾與提交 &am…

視覺分析明火檢測助力山東化工廠火情防控

視覺分析技術賦能化工廠火情防控:從山東事故看明火與煙霧檢測的應用價值 一、背景:山東化工事故中的火情防控痛點 近期,山東高密友道化學有限公司、淄博潤興化工科技有限公司等企業接連發生爆炸事故,暴露出傳統火情防控手段的局…

【小程序】微信小程序備案失敗,有請DeepSeek閃亮出場,看TA如何快速給出解決方案

🌹歡迎來到《小5講堂》🌹 🌹這是《小程序》系列文章,每篇文章將以博主理解的角度展開講解。🌹 🌹溫馨提示:博主能力有限,理解水平有限,若有不對之處望指正!&a…

Oracle正則表達式學習

目錄 一、正則表達簡介 二、REGEXP_LIKE(x,匹配項) 三、REGEXP_INSTR 四、REGEXP_SUBSTR 五、REGEXP_REPLACE 一、正則表達簡介 相關網址: https://cloud.tencent.com/developer/article/1456428 https://www.cnblogs.com/lxl57610/p/8227599.html https://…

vscode 代理模式(agent mode),簡單嘗試一下。

1. 起因, 目的: agent mode, 很流行,名氣很大。簡單試試效果,確實很強。agent mode, 取代人工,確實是前進了一大步。 2. 先看效果 效果對比,左邊是 普通的AI 生成的, 右邊是 代理…

貝銳蒲公英工業路由器R300A海外版:支持多國4G頻段,全球組網

為更好地滿足全球部署和企業出海項目的多樣化需求,貝銳蒲公英異地組網工業路由器R300A海外版全新上市,并已正式上架速賣通!無論是跨國分支機構協同辦公,還是海外工廠設備遠程運維,R300A海外版都能為企業提供靈活、高性…

自然圖像數據集

目錄 CIFAR-10 數據集CIFAR-100 數據集AFHQ 數據集FFHQ 數據集 CIFAR-10 數據集 簡介: CIFAR-10 是一個經典的圖像分類數據集,廣泛用于機器學習領域的計算機視覺算法基準測試。它包含60000幅32x32的彩色圖像,分為10個類,每類6000…