Java的代理模式怎麼理解
代理模式:靜態代理人
有時候,我們可能不想直接面對某事或某人,這樣我們就可以找一個中介的人去替我們做,例如送禮物叫跑腿、找清潔上某某同城等等。這樣對方也不知道中介的背後是誰參與,起到一個中介作用和保護目標物的作用,這就是代理模式。也就是有一個中介代替你去做。
1、代理模式的定義
由於某些原因需要提供一個代理程式給某個物件以控制對該物件的存取。這時,存取對像不適合或不能直接引用目標對象,代理對像作為訪問對象和目標對象之間的中介
#簡單結構圖:
2、代理模式的優缺點
#優點:
1.在客戶端與目標物件之間起到一個中介作用和保護目標物件的作用
2.可以擴展目標物件的功能
3.能將客戶端與目標物件分離,在一定程度上降低了系統的耦合度,增加了程式的可擴展性
缺點:
1.會造成系統設計中類別的數量增加(因為多了一個或多個中介類別(代理))
2.在客戶端與目標對象之間增加一個代理對象,會造成請求處理速度變慢
#3.增加了系統的複雜度
3、代理模式的分類
代理模式分為靜態代理程式(本文)與動態代理程式(下一篇文章):
靜態: 由程式設計師建立代理類別或特定工具自動產生原始程式碼再對其編譯,在程式執行前代理類別的.class 檔案就已經存在了
動態: 在程式運作時,運用反射機制動態創建而成
#4、靜態代理模式的結構
1.抽象主題類別: 透過介面或抽象類別宣告真實主題和代理物件實現的業務方法
2.真實主題類別: 實作了抽象主題中的具體業務,是代理對象所代表的真實對象,是最終要引用的對象
3.代理類: 提供了與真實主題相同的接口,其內部含有對真實主題的引用,它可以存取、控製或擴展真實主題的功能
#程式碼演示:
定義一個抽象主題:
#靜態代理程式在使用時,需要定義介面或父類,而被代理物件與代理物件一起實作相同的介面或是繼承相同父類別
/** *抽象主题 */ public interface Subject { void Request(); }
真實主題:
/** *真实主题类:实现抽象主题 */ public class RealSubject implements Subject{ @Override public void Request() { System.out.println("您的航班正在飞行"); } }
代理程式類別:
//代理类,实现抽象类的接口 public class Proxy implements Subject{ private RealSubject realSubject; @Override public void Request() { //先判断是否存在真实主题RealSubject //如果没有,就新建一个 if(realSubject == null){ realSubject = new RealSubject(); } //预处理,使用这个方法 preRequest(); //去访问真实主题类的方法 realSubject.Request(); //代理类的后续方法 postRequest(); } private void preRequest() { System.out.println("航班马上起飞啦"); } private void postRequest() { System.out.println("航班到达目的地,感谢乘坐"); } }
測試類別:
public class Test { public static void main(String[] args) { //使用代理去访问RealSubject里面的Request Proxy proxy = new Proxy(); proxy.Request(); } }
輸出結果:
航班馬上起飛啦
您的航班正在飛行
航班到達目的地,感謝乘坐
通過上面的演示,用來一個代理類去訪問了真實主題類別的方法,這樣測試類別就不知道到底是誰來訪問的,是代理類別呢還是代理類別後面還有其他人,這樣就可以很好的保護對象。這也是代理模式的優點。
靜態代理程式的總結:
可以在不修改目標物件的功能前提下,對目標實作功能擴展,但是代理物件需要與目標物件實作一樣的接口,所以會有很多代理類,當代理類很多的時候,維護的複雜度就會變大,那該怎麼解決這個問題呢?那就需要使用動態代理。
5、代理模式的應用場景
當無法或不想直接引用某個物件或存取某個物件有困難時,可以透過代理物件間接存取。使用代理模式主要有兩個目的:一是保護目標對象,二是增強目標對象
#此應用程式場景總結參考自互聯網:
#遠端代理,這種方式通常是為了隱藏目標物件存在於不同位址空間的事實,方便客戶端存取。例如,當使用者申請某些網盤空間時,會在使用者的檔案系統中建立一個虛擬的硬碟,使用者造訪虛擬硬碟時實際存取的是網盤空間
虛擬代理,這種方式通常用於要建立的目標物件開銷很大時。例如,下載一幅很大的圖像需要很長時間,因某種計算比較複雜而短時間無法完成,這時可以先用小比例的虛擬代理替換真實的對象,消除用戶對伺服器慢的感覺
安全代理,這種方式通常用來控制不同種類客戶對真實物件的存取權
智慧指引,主要用於呼叫目標物件時,代理附加一些額外的處理功能。例如,增加計算真實物件的引用次數的功能,這樣當該物件沒有被引用時,就可以自動釋放它
延遲加載,指為了提高系統的效能,延遲對目標的載入。例如,Hibernate 中就存在屬性的延遲載入和關聯表的延時載入
以上是Java的代理模式怎麼理解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

Java 8引入了Stream API,提供了一種強大且表達力豐富的處理數據集合的方式。然而,使用Stream時,一個常見問題是:如何從forEach操作中中斷或返回? 傳統循環允許提前中斷或返回,但Stream的forEach方法並不直接支持這種方式。本文將解釋原因,並探討在Stream處理系統中實現提前終止的替代方法。 延伸閱讀: Java Stream API改進 理解Stream forEach forEach方法是一個終端操作,它對Stream中的每個元素執行一個操作。它的設計意圖是處

膠囊是一種三維幾何圖形,由一個圓柱體和兩端各一個半球體組成。膠囊的體積可以通過將圓柱體的體積和兩端半球體的體積相加來計算。本教程將討論如何使用不同的方法在Java中計算給定膠囊的體積。 膠囊體積公式 膠囊體積的公式如下: 膠囊體積 = 圓柱體體積 兩個半球體體積 其中, r: 半球體的半徑。 h: 圓柱體的高度(不包括半球體)。 例子 1 輸入 半徑 = 5 單位 高度 = 10 單位 輸出 體積 = 1570.8 立方單位 解釋 使用公式計算體積: 體積 = π × r2 × h (4

Spring Boot簡化了可靠,可擴展和生產就緒的Java應用的創建,從而徹底改變了Java開發。 它的“慣例慣例”方法(春季生態系統固有的慣例),最小化手動設置
