【設計模式】深入解析代理模式(委托模式):代理模式思想、靜態模式和動態模式定義與區別、靜態代理模式代碼實現

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述


代理模式


代理模式,也叫委托模式

Spring AOP 是基于動態代理來實現 AOP 的


定義


  • 其他對象提供一種代理 以控制對這個對象的訪問
  • 它的作用就是通過提供一個代理類,讓我們在調用目標方法的時候,不再是直接對目標方法進行調用,而是通過代理類間接調用

在某些情況下,一個對象不適合或者不能直接引用另一個對象,而代理對象可以在客戶端目標對象之間起到中介的作用。


使用代理前:

image-20250420174514464


使用代理后:

image-20250420174527254


代理模式角色


角色名稱描述房屋租賃中的對應角色
Subject業務接口類
可以是抽象類或者接口(不一定有)。
定義了業務操作的接口。
房屋租賃的通用操作(如出租房屋)
RealSubject業務實現類
具體的業務執行,也就是被代理對象
房東
Proxy代理類
RealSubject 的代理
代理對象內部含有對 RealSubject 的引用,并實現 Subject 接口
中介

UML 類圖如下:

image-20250420174647181

簡單總結一下:

  • 首先,Subject 是一個接口或者抽象類,定義了 RealSubjectProxy共同方法
  • RealSubject 實際執行任務的對象,而 Proxy控制對 RealSubject 的訪問

兩種代理模式的區別


代理模式可以在不修改被代理對象的基礎上,通過擴展代理類,進行一些功能的附加增強


根據代理創建時期代理模式分為靜態代理動態代理靜態代理是在編譯時確定代理關系,而動態代理是在運行時動態生成的


  • 靜態代理:
    • 由程序員創建代理類特定工具自動生成源代碼再對其編譯
    • 程序運行前代理類 .class 文件就已經存在了。

  • 動態代理:
    • 在程序運行時,運用反射機制動態創建而成。

靜態代理


靜態代理:在程序運行前,代理類的 .class 文件就已經存在了。

在出租房子之前,中介已經做好了相關的工作,就等租戶來租房子了;

我們通過代碼來加深理解。以房租租賃為例:


定義接口(定義房東要做的事情,也是中介需要做的事情):

image-20250421215536731


實現接口(房東出租房子):

image-20250421215735024


代理(中介,幫房東出租房子):

image-20250421215904847


  1. RealSubject 實際執行任務的對象,而 Proxy控制對 RealSubject 的訪問
  2. 代理對象內部含有對 RealSubject 的引用,并實現 Subject 接口

所以中介類中,應該有房東,因為只有房東授權,中介才能帶中介看房子

image-20250421220159344


中介的 saleHouse() 調用房東的 saleHouse(),表示真正賣房的人是房東:

image-20250421220446801

本質是房東的 saleHouse() 借助中介的 saleHouse() 套了一層殼:


租客來看房了,房租對中介進行授權,讓中介有帶租客看房子的權力:

image-20250421220923557


我們在拆的細一點:

image-20250421221523649


上面的代碼邏輯是,房東需要出租一個房子 target 給租客,房東先把房子 target 這個任務給中介;


但是上面的代碼還是不夠好,因為租房子應該使用接口的方法:

image-20250421222757349


修改:

image-20250421223159655


image-20250421223737493


運行結果:

image-20250421224314645


image-20250421224245055


租客 中介(Proxy) 房東(RealSubject) 我要租房 檢查租客資質 轉發租房請求 確認可出租 簽訂代理合同 交付鑰匙 租客 中介(Proxy) 房東(RealSubject)

上面這個代理實現方式就是靜態代理(仿佛啥也沒干)

從上述程序可以看出,雖然靜態代理完成了對目標對象的代理,但是由于代碼都寫死了對目標對象的每個方法的增強都是手動完成的,非常不靈活。所以日常開發幾乎看不到靜態代理的場景。


接下來新增需求:中介又新增了其他業務:代理房屋出售。

我們需要對上述代碼進行修改:


  1. 接口定義修改。

image-20250421224636230


  1. 接口實現修改。

image-20250421224525655


  1. 代理類修改。

image-20250421224621059


從上述代碼可以看出,我們修改接口(Subject)業務實現類(RealSubject)時,還需要修改代理(Proxy)

同樣的,如果有新增接口(Subject)業務實現類(RealSubject),也需要對每一個業務實現類新增代理類(Proxy)

既然代理的流程是一樣的,有沒有一種辦法,讓他們通過一個代理類來實現呢? 這就需要用到動態代理技術了。


動態代理


相比于靜態代理來說,動態代理更加靈活

我們不需要針對每個目標對象單獨創建一個代理對象,而是把這個創建代理對象的工作推遲到程序運行時由 JVM 來實現。也就是說動態代理在程序運行時,根據需要動態創建生成。

比如房屋中介,我不需要提前預測都有哪些業務,而是業務來了我再根據情況創建。


Java 也對動態代理進行了實現,并給我們提供了一些 API,常見的實現方式有兩種:

  1. JDK 動態代理。
  2. CGLIB 動態代理。

動態代理在我們日常開發中使用的相對較少,但是在框架中幾乎是必用的一門技術。

學會了動態代理之后,對于我們理解和學習各種框架的原理也非常有幫助:

https://xiaolllei.blog.csdn.net/article/details/147427226?spm=1011.2415.3001.5331


在這里插入圖片描述

在這里插入圖片描述

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

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

相關文章

利用java語言,怎樣開發和利用各種開源庫和內部/自定義框架,實現“提取-轉換-加載”(ETL)流程的自動化

一、ETL 架構設計的核心要素? 在企業級數據處理場景中,ETL(Extract-Transform-Load)流程自動化是數據倉庫、數據湖建設的核心環節。基于 Java 生態的技術棧,我們可以構建分層解耦的 ETL 架構,主要包含以下四層結構&am…

2023藍帽杯初賽內存取證-8

也是用到pslist模塊,加上grep過濾”chrome“即可: vol.py --plugin/opt/volatility/plugins -f memdump.mem --profile Win7SP1x64 pslist | grep "chrome" 第一個是PID,第二個是PPID,第三個是線程數,第四個…

【C語言】動態內存的常見錯誤

前言&#xff1a; 在上章節中講解了動態內存的概念和管理的核心函數。 在本章節繼續為大家介紹動態內存的常見錯誤&#xff0c;讓大家更好的理解運用。 補充&#xff1a;使用內存函數需要頭文件<stdlib.h> 對NULL指針的解引用操作 當使用malloc、calloc或realloc等函…

uniapp-x 二維碼生成

支持X&#xff0c;二維碼生成&#xff0c;支持微信小程序&#xff0c;android&#xff0c;ios&#xff0c;網頁 - DCloud 插件市場 免費的單純用愛發電的

Linux內核之文件驅動隨筆

前言 近期需要實現linux系統文件防護功能&#xff0c;故此調研了些許知識&#xff0c;如何實現文件防護功能從而實現針對文件目錄防護功能。當被保護的目錄&#xff0c;禁止增刪改操作。通過內核層面實現相關功能&#xff0c;另外在通過跟應用層面交互從而實現具體的業務功能。…

利用大模型實現地理領域文檔中英文自動化翻譯

一、 背景描述 在跨國性企業日常經營過程中&#xff0c;經常會遇到專業性較強的文檔翻譯的需求&#xff0c;例如法律文書、商務合同、技術文檔等&#xff1b;以往遇到此類場景&#xff0c;企業內部往往需要指派專人投入數小時甚至數天來整理和翻譯&#xff0c;效率低下&#x…

鴻蒙Flutter倉庫停止更新?

停止更新 熟悉 Flutter 鴻蒙開發的小伙伴應該知道&#xff0c;Flutter 3.7.12 鴻蒙化 SDK 已經在開源鴻蒙社區發布快一年了&#xff0c; Flutter 3.22.x 的鴻蒙化適配一直由鴻蒙突擊隊倉庫提供&#xff0c;最近有小伙伴反饋已經 2 個多月沒有停止更新了&#xff0c;不少人以為停…

(七)深入了解AVFoundation-采集:采集系統架構與 AVCaptureSession 全面梳理

引言 在 iOS 開發中&#xff0c;AVFoundation 是構建音視頻功能的強大底層框架。而在音視頻功能中&#xff0c;“采集”往往是最基礎也是最關鍵的一環。從攝像頭捕捉圖形、到麥克風獲取聲音&#xff0c;構建一條高效且穩定的采集鏈是開發高質量音視頻應用的前提。 本系列將逐…

QML ShaderEffect(著色器效果)組件

ShaderEffect 是 QML 中用于實現自定義著色器效果的組件&#xff0c;允許開發者使用 GLSL 著色器語言創建圖形效果。 核心屬性 基本屬性 屬性類型默認值說明fragmentShaderstring""片段著色器代碼vertexShaderstring""頂點著色器代碼blendingbooltrue是…

基于javaweb的SSM教材征訂與發放管理系統設計與實現(源碼+文檔+部署講解)

技術范圍&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬蟲、數據可視化、小程序、安卓app、大數據、物聯網、機器學習等設計與開發。 主要內容&#xff1a;免費功能設計、開題報告、任務書、中期檢查PPT、系統功能實現、代碼編寫、論文編寫和輔導、論文…

大模型學習筆記------Llama 3模型架構之分組查詢注意力(GQA)

大模型學習筆記------Llama 3模型架構之分組查詢注意力&#xff08;GQA&#xff09; 1、分組查詢注意力&#xff08;GQA&#xff09;的動機2、 多頭注意力&#xff08;Multi-Head Attention, MHA&#xff09;3、 多查詢注意力 (Multi-Query Attention&#xff0c;MQA)4、 分組查…

matlab 環形單層柱狀圖

matlab 環形單層柱狀圖 matlab 環形單層柱狀圖 matlab 環形單層柱狀圖 圖片 圖片 【圖片來源粉絲】 我給他的思路是&#xff1a;直接使用風玫瑰圖可以畫出。 rose_bar 本次我的更新和這個有些不同&#xff01;是環形柱狀圖&#xff0c;可調節細節多&#xff1b; 只需要函數…

Docker--Docker網絡原理

虛擬網卡 虛擬網卡&#xff08;Virtual Network Interface&#xff0c;簡稱vNIC&#xff09; 是一種在軟件層面模擬的網卡設備&#xff0c;不依賴于物理硬件&#xff0c;而是通過操作系統或虛擬化技術實現網絡通信功能。它允許計算機在虛擬環境中模擬物理網卡的行為&#xff0…

linux基礎14--dns和web+dns

DNS&#xff1a;域名系統&#xff08;Domain Name System&#xff09; DNS協議是用來將域名轉換為IP地址或將IP地址轉換為相應的域名 DNS使用TCP和UDP端口53&#xff0c;給用戶提供解析時一般使用UDP53 對于每一級域名長度的限制是63個字符&#xff0c;域名總長度則不能超過2…

C++抽象基類定義與使用

在 C 中&#xff0c;抽象基類&#xff08;Abstract Base Class, ABC&#xff09; 是一種特殊的類&#xff0c;用于定義接口規范和約束派生類的行為。它通過純虛函數&#xff08;Pure Virtual Function&#xff09;強制要求派生類實現特定功能&#xff0c;自身不能被實例化。以下…

用selenium4 webdriver + java 搭建并完成第一個自動化測試腳本

自動化測試任務&#xff1a; 百度搜索自己的姓名。點擊第一個鏈接&#xff08;或者第二個&#xff09;&#xff0c;在新的頁面上&#xff0c;添加斷言&#xff0c;驗證你的名字是否存在。 實驗資料百度網盤下載路徑&#xff1a; 鏈接: https://pan.baidu.com/s/1nVlHX_ivres…

LLM大模型中的基礎數學工具—— 約束優化

Q26: 推導拉格朗日乘子法 的 KKT 條件 拉格朗日乘子法與 KKT 條件是啥&#xff1f; 拉格朗日乘子法是解決約束優化問題的利器。比如&#xff0c;想最小化函數 &#xff0c;同時滿足約束 &#xff0c;就構造拉格朗日函數 &#xff08; 是乘子&#xff09;。KKT 條件是解這類問…

net+MySQL中小民營企業安全生產管理系統(源碼+lw+部署文檔+講解),源碼可白嫖!

摘要 近些年來&#xff0c;隨著科技的飛速發展&#xff0c;互聯網的普及逐漸延伸到各行各業中&#xff0c;給人們生活帶來了十分的便利&#xff0c;中小民營企業安全生產管理系統利用計算機網絡實現信息化管理&#xff0c;使企業的中小民營企業安全生產管理發展和服務水平有顯…

論文閱讀:2024 arxiv AI Safety in Generative AI Large Language Models: A Survey

總目錄 大模型安全相關研究:https://blog.csdn.net/WhiffeYF/article/details/142132328 AI Safety in Generative AI Large Language Models: A Survey 生成式人工智能大型語言模型中的人工智能安全性:一項調查 https://arxiv.org/pdf/2407.18369 https://www.doubao.com…

【MySQL數據庫】表的約束

目錄 1&#xff0c;空屬性 2&#xff0c;默認值 3&#xff0c;列描述 4&#xff0c;zerofill 5&#xff0c;主鍵primary key 6&#xff0c;自增長auto_increment 7&#xff0c;唯一鍵unique 8&#xff0c;外鍵foreign key 在MySQL中&#xff0c;表的約束是指用于插入的…