代理模式:靜態代理人
有時候,我們可能不想直接面對某事或某人,這樣我們就可以找一個中介的人去替我們做,例如送禮物叫跑腿、找清潔上某某同城等等。這樣對方也不知道中介的背後是誰參與,起到一個中介作用和保護目標物的作用,這就是代理模式。也就是有一個中介代替你去做。
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中文網其他相關文章!

本文討論了使用Maven和Gradle進行Java項目管理,構建自動化和依賴性解決方案,以比較其方法和優化策略。

本文使用Maven和Gradle之類的工具討論了具有適當的版本控制和依賴關係管理的自定義Java庫(JAR文件)的創建和使用。

本文討論了使用咖啡因和Guava緩存在Java中實施多層緩存以提高應用程序性能。它涵蓋設置,集成和績效優勢,以及配置和驅逐政策管理最佳PRA

本文討論了使用JPA進行對象相關映射,並具有高級功能,例如緩存和懶惰加載。它涵蓋了設置,實體映射和優化性能的最佳實踐,同時突出潛在的陷阱。[159個字符]

Java的類上載涉及使用帶有引導,擴展程序和應用程序類負載器的分層系統加載,鏈接和初始化類。父代授權模型確保首先加載核心類別,從而影響自定義類LOA


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

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

Atom編輯器mac版下載
最受歡迎的的開源編輯器

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

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

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中