《Java千問》你瞭解代理模式嗎?

什麼是代理模式?

一句話描述:代理模式是一種使用代理對象來執行目標對象的方法並在代理對象中增強目標對象方法的一種設計模式。

詳細描述:

1理論基礎-代理模式是設計原則中的“開閉原則(對擴展開放、對修改關閉)”的具體實踐,代理對象代爲執行目標對象的方法,並在此基礎上進行相應的擴展。

2詳細內容-代理模式主要目的爲其他對象提供一種代理以控制對這個對象的訪問。主要解決在某些情況下,一個對象不適合或者不能直接引用另一個對象,而代理對象可以在調用對象和目標對象之間起到中介的作用。

比如說:要訪問的對象在遠程的機器上。在面向對象系統中,有些對象由於某些原因(比如對象創建開銷很大,或者某些操作需要安全控制,或者需要進程外的訪問),直接訪問會給使用者或者系統結構帶來很多麻煩,我們可以在訪問此對象時加上一個對此對象的訪問層。

3分類-代理模式可以分爲靜態代理和動態代理。代理模式是思想,靜態代理和動態代理是兩種不通的實現方式。

靜態代理是由程序員編寫代理類的源碼,再編譯代理類。所謂靜態也就是在程序運行前就已經存在代理類的字節碼文件,代理類和委託類的關係在運行前就確定了。

動態代理是代理類的源碼是在程序運行期間由編譯器動態的生成(如JVM根據反射等機制生成代理類)。代理類和委託類的關係是在程序運行時確定。實現階段不用關係代理是哪個,而在運行階段指定具體哪個代理。

 

代理模式的組成元素有哪些?

Interface: 代理類和被代理類實現同樣的接口

Proxy:代理類,裏面有被代理類,具體邏輯委託被代理類進行處理

RealObject:被代理類,具體的業務處理

Client:看到的是代理類,並不知道具體處理業務邏輯的類,降低耦合性

 

 

動態代理的做法:在運行時刻,可以動態創建出一個實現了多個接口的代理類。每個代理類的對象都會關聯一個表示內部處理邏輯的InvocationHandler接 口的實現。當使用者調用了代理對象所代理的接口中的方法的時候,這個調用的信息會被傳遞給InvocationHandlerinvoke方法。在 invoke方法的參數中可以獲取到代理對象、方法對應的Method對象和調用的實際參數。invoke方法的返回值被返回給使用者。這種做法實際上相 當於對方法調用進行了攔截。(以Java動態代理爲例)

 

 

動態代理與靜態代理相比較,最大的好處是接口中聲明的所有方法都被轉移到調用處理器一個集中的方法中處理(InvocationHandler.invoke)。這樣,在接口方法數量比較多的時候,我們可以進行靈活處理,而不需要像靜態代理那樣每一個方法進行中轉。而且動態代理的應用使我們的類職責更加單一,複用性更強。

 

代理模式的使用場景是什麼?

代理模式的類型較多,不同類型的代理模式有不同的優缺點,它們應用於不同的場合

(1) 當客戶端對象需要訪問遠程主機中的對象時可以使用遠程代理

(2) 當需要用一個消耗資源較少的對象來代表一個消耗資源較多的對象,從而降低系統開銷、縮短運行時間時可以使用虛擬代理,例如一個對象需要很長時間才能完成加載時。

(3) 當需要爲某一個被頻繁訪問的操作結果提供一個臨時存儲空間,以供多個客戶端共享訪問這些結果時可以使用緩衝代理。通過使用緩衝代理,系統無須在客戶端每一次訪問時都重新執行操作,只需直接從臨時緩衝區獲取操作結果即可。

 (4) 當需要控制對一個對象的訪問,爲不同用戶提供不同級別的訪問權限時可以使用保護代理

 (5) 當需要爲一個對象的訪問(引用)提供一些額外的操作時可以使用智能引用代理

 

代理模式的優缺點是什麼?

優點: 

1、能夠協調調用者和被調用者,在一定程度上降低了系統的耦合度。

2、客戶端可以針對抽象主題角色進行編程,增加和更換代理類無須修改源代碼,符合開閉原則,系統具有較好的靈活性和可擴展性。

缺點:

1、由於在客戶端和真實主題之間增加了代理對象,因此有些類型的代理模式可能會造成請求的處理速度變慢。

2、實現代理模式需要額外的工作,有些代理模式的實現非常複雜。

 

代理模式與裝飾器模式和適配器有什麼區別?

1、和適配器模式的區別:適配器模式主要改變所考慮對象的接口,而代理模式不能改變所代理類的接口。

2、和裝飾器模式的區別:裝飾器模式爲了增強功能,而代理模式是爲了加以控制。


============================================================

歡迎關注公衆號:程序員面試經驗分享(jobbible)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章