java設計模式(六)代理模式(Proxy Pattern)

1、模式介紹:

代理模式(Proxy Pattern)是一種結構型設計模式,它允許你在不改變客戶端代碼的情況下,向某個對象提供一個代理,以控制對該對象的訪問。代理對象通常會在實際對象的方法調用前后添加一些附加邏輯,如權限控制、懶加載、日志記錄等。

代理模式涉及以下幾個角色:

接口(Subject):定義了代理類和真實類共同的接口。

真實類(RealSubject):實現了接口的具體類,它是真正執行操作的對象。

代理類(Proxy):也實現了接口,持有真實類的引用,并在調用真實類的方法前后進行一些額外的處理。

2、應用場景:

遠程代理(Remote Proxy):為一個對象在不同地址空間提供局部代表。典型應用是 RMI(遠程方法調用)。

虛擬代理(Virtual Proxy):根據需要創建開銷大的對象。它在真正需要時才創建對象。

保護代理(Protection Proxy):控制對原始對象的訪問。通常用于對象應該有不同的訪問權限。

智能引用(Smart Reference):在訪問對象時提供額外的功能,例如引用計數、緩存等。

3、優點:

控制對真實對象的訪問,增加系統的靈活性。

可以對真實對象進行擴展,而不修改其代碼。

提供了對目標對象額外的操作,如權限控制、延遲加載、日志記錄等。

4、缺點:

增加了系統的復雜度,尤其是在使用保護代理時。

可能會影響請求的處理速度,因為增加了間接層。

5、代碼實現:

/*** 代理接口** @author FM_南風* @date 2024/6/25 13:28*/
public interface Subject {void request();
}/*** 實體類** @author FM_南風* @date 2024/6/25 13:28*/
public class RealSubject implements Subject{@Overridepublic void request() {System.out.println("實體類的請求");}
}/*** 代理類** @author FM_南風* @date 2024/6/25 13:30*/
public class Proxy implements Subject {private RealSubject realSubject;@Overridepublic void request() {if (realSubject == null) {realSubject = new RealSubject();}preRequest();realSubject.request();postRequest();}private void preRequest() {System.out.println("代理類: 前置處理");}private void postRequest() {System.out.println("代理類: 后置處理");}
}/*** 應用** @author FM_南風* @date 2024/6/25 13:31*/
public class ProxyClient {public static void main(String[] args) {Subject proxy = new Proxy();proxy.request();}
}

6、結果展示:


7、拓展動態代理:

還可以使用動態代理來實現代理模式,它使用 java.lang.reflect.Proxy 類和 InvocationHandler 接口來動態地創建代理對象。動態代理可以在運行時動態地將代理邏輯添加到真實對象中,而不需要在編譯時顯式地創建代理類。

/*** 動態代理** @author FM_南風* @date 2024/6/25 13:37*/
public class ProxyInvocationHandler implements InvocationHandler {private Object realSubject;public ProxyInvocationHandler(Object realSubject) {this.realSubject = realSubject;}@Overridepublic Object invoke(Object o, Method method, Object[] objects) throws Throwable {System.out.println("動態代理類: 前置處理");Object result = method.invoke(realSubject, objects);System.out.println("動態代理類: 后置處理");return result;}
}/*** 動態代理應用** @author FM_南風* @date 2024/6/25 13:39*/
public class ProxyInvocationClient {public static void main(String[] args) {RealSubject realSubject = new RealSubject();Subject proxy = (Subject) Proxy.newProxyInstance(realSubject.getClass().getClassLoader(),realSubject.getClass().getInterfaces(),new ProxyInvocationHandler(realSubject));proxy.request();}
}

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

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

相關文章

【LeetCode】每日一題:三數之和

解題思路 最開始是打算沿著二數之和的思路做,即固定了最大的,然后小的開始遍歷,因為這種遍歷方式只需要遍歷一輪就能完成,所以復雜度應該是O(n2),但是最后幾個示例還是超時了,可能進…

《UDS協議從入門到精通》系列——圖解0x35:請求上傳

《UDS協議從入門到精通》系列——圖解0x35:請求上傳 一、簡介二、數據包格式2.1 服務請求格式2.2 服務響應格式2.2.1 肯定響應2.2.2 否定響應 三、通信示例 Tip📌:本文描述中但凡涉及到其他UDS服務的,將陸續提供鏈接跳轉方式以便快…

解決Java中的NoSuchElementException異常的常見方法

解決Java中的NoSuchElementException異常的常見方法 大家好,我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編,也是冬天不穿秋褲,天冷也要風度的程序猿!在Java編程中,NoSuchElementException異常是一個…

AMSR-E/Aqua 第 3 級全球地表土壤水分月平均值 V005 (AMSRE_AVRMO)

AMSR-E/Aqua level 3 global monthly Surface Soil Moisture Averages V005 (AMSRE_AVRMO) at GES DISC AMSR-E/Aqua level 3 global monthly Surface Soil Moisture Standard Deviation V005 (AMSRE_STDMO) at GES DISC 簡介 GES DISC 的 AMSR-E/Aqua 第 3 級全球地表土壤水…

操作系統入門 -- 內存管理

操作系統入門 – 內存管理 1.內存種類 1.1 虛擬內存(VIRT) 進程需要的虛擬內存大小,包括進程使用的庫、代碼、數據以及malloc、new分配的堆空間和棧空間等。若進程申請了10MB內存但實際使用了1MB,則物理空間會增長10MB。 1.2 …

Resource punkt not found.的解決方法

這個問題本來不想記錄,但是在好幾個機子上都碰到了(用到了LangChain讀Word文檔)。簡單記錄一下。看到報錯以后運行: import nltk # nltk.set_proxy(http://192.168.1.68:10811) nltk.download() 中間這句我注釋掉了,…

接軌國際安全標準:等保認證在提升企業全球競爭力中的核心作用

隨著全球化進程的加速和數字經濟的蓬勃發展,信息安全已成為企業拓展國際市場、參與國際競爭的重要基石。網絡安全等級保護(簡稱“等保”)認證,作為衡量企業信息安全管理水平的重要標尺,不僅體現了企業的技術實力和合規…

速盾:ddos攻擊類型有哪些?

DDoS攻擊(分布式拒絕服務攻擊)是一種通過利用多個被感染的計算機或網絡設備,以大量的請求或數據包來占用目標系統資源,導致其無法正常提供服務的攻擊方式。DDoS攻擊常常被黑客用來影響目標的可用性,造成經濟損失或打擊…

如何以智能方式安裝 Python

Python易于使用,對初學者友好,功能強大,幾乎可以為任何應用程序創建強大的軟件。 但與任何其他軟件一樣,Python 的設置和管理可能很復雜。 在本文中,我們將介紹如何正確設置 Python。 您將學習如何選擇合適的版本、…

學習筆記——動態路由——RIP(附加度量值配置)

六、附加度量值配置 RIP協議cost開銷值:默認值為0,路由信息每傳遞一次,值增加1,最大15,(路由器不能超過15臺)16代表不可達。 入接口附加度量值 rip metricin 5 //可以修改開銷改變路徑。只能增加,不能減小 …

count(*) over (partition by ……)用法詳解

select id,count(*) over(partition by pro_id) from sal; 以pro_id分組,統計分組后每個pro_id的記錄總數及對應的id; 類似還有count(*) over(order by ……)、sum(amount) over(partition by ……)等,略有區別

降低企業運營成本的API服務有哪些?

通過API服務,企業可以實現許多功能和服務的自動化和優化,從而有效降低企業的運營成本。API服務可以幫助企業簡化流程、減少人工操作、提高效率,并提供數據支持和決策依據,從而實現成本的有效控制和降低。無論是人力資源管理、客戶…

【D3.js in Action 3 精譯】1.2.2 可縮放矢量圖形(一)

譯注 由于 1.2.2 小節介紹 SVG 的篇幅過多,為了方便查閱,后續將分多個小節依次進行翻譯。為了確保整個 1.2.2 小節的完整性,特意將上一篇包含的 SVG 小節的內容整理出來重新編排。敬請留意。 1.2.2 SVG - 可縮放矢量圖形 可伸縮矢量圖形&…

kaoYan-English

英語的提高是個日積月累,可以花一個月時間突擊政治。但英語不可。關鍵在于單詞和閱讀理解 提高英語成績的捷徑,多做閱讀題。閱讀理解的分值高,閱讀理解在鞏固詞匯,培養語感有不可替代作用。 選資料,貼合考研難度的&a…

x264 編碼器 i_intra_cost 計算過程

介紹 是uint16_t類型指針變量,用來存儲每個宏塊的幀內代價值,在 frame.h 文件中x264_frame_t結構體中聲明。在*frame_new 函數中將lowres_costs[0][0]指向給i_intra_cost,并 memset 為-1;//代碼有刪減 frame->i_intra_cost = frame->lowres_costs[0][0]; memset( fra…

Raspbian命令行連接WiFi網絡

Raspbian命令行連接WiFi網絡 1. 源由2. 環境3. 信號4. 連接5. 檢查6. 斷開 1. 源由 “懶人”多福,是什么原因,大家知道不,哈哈。 如果大家關注過之前《Ardupilot開源代碼之Rover上路計劃》,為了筆記本電腦在不斷網的情況下進行配…

Rust 中使用 :: 這種語法的幾種情況

文章目錄 1. 訪問模塊成員:2. 訪問關聯函數或靜態方法:3. 訪問 trait 的關聯類型或關聯常量4. 指定泛型類型參數 1. 訪問模塊成員: mod utils {pub fn do_something() { /* ... */ } }let result utils::do_something();2. 訪問關聯函數或靜…

【Spring Cloud Alibaba AI】簡單使用

本文基于官方文檔。 Spring AI 官方文檔:Spring AI :: Spring AI Reference 中文文檔:Spring AI 簡介 - spring 中文網 (springdoc.cn) Spring AI 是 Spring 官方社區項目,旨在簡化 Java AI 應用程序開發,讓 Java 開發者像使用…

達夢數據庫死鎖排查和解決

達夢數據庫死鎖排查和解決 鏈接: 達夢數據庫死鎖排查和解決

道路元素位置和方向的坐標系統: 點 線 面 連接點

道路元素位置和方向的坐標系統: 下圖道路元素在地球坐標系中的位置,該位置由三個坐標軸(x, y, z)組成的笛卡爾坐標系來確定。這種描述特別適用于三維建模和地理信息系統(GIS)中,其中道路被視為一個三維模型…