動態代理模式

動態代理模式屬於比較困難的一個設計模式。
開發中用到的很少,因爲動態代理模式的應用場景是搭建框架,對於大部分人而言能用就可以了,根本沒機會寫。
但是動態代理模式學習掌握明白去分析可以源碼很有幫助了。

 

一:靜態代理模式

 

事物的發展是有規律的,現有靜態纔會有動態的需求。
代理模式給某一個對象提供一個代理對象,並由代理對象控制對原對象的引用。通俗的來講代理模式就是我們生活中常見的中介。

靜態代理在使用時,需要定義接口或者父類,被代理對象與代理對象一起實現相同的接口或者是繼承相同父類。一般來說,被代理對象和代理對象是一對一的關係,當然一個代理對象對應多個被代理對象也是可以的。
靜態代理,一對一則會出現時靜態代理對象量多、代碼量大,從而導致代碼複雜,可維護性差的問題。一對多則代理對象會出現擴展能力差的問題。
方案一:一對一,100個真實對象需要代理,那就寫出100個代理對象去代理,代碼多,修改工作量巨大。
方案二:一對多,100個真實對象公用一個代理,那就需要1個代理和100個真實對象同時產生關係,關係非常複雜很難擴展。

所以靜態代理侷限性很大,只適合明確知道真實對象是誰,而且數量不多情況下。
如果不知道真實對象的名字,不知道會有多少真實對象需要代理的情況下根本無法使用
具體代碼:

 

 

 

image.png

image.png

 

image.png

image.png

二:反射
靜態存在侷限,那只有動態代理去解決了
那就需要用到反射
Reflection(反射)是Java被視爲動態語言的關鍵,反射機制允許程序在執行期藉助於Reflection API取得任何類的內部信息,並能直接操作任意對象的內部屬性及方法。

 

反射就是在運行時才知道要操作的類是什麼,並且可以在運行時獲取類的完整構造,並調用對應的方法。
在運行時構造任意一個類的對象
在運行時獲取任意一個類所具有的成員變量和方法
在運行時調用任意一個對象的方法(屬性)

三動態代理模式

 

image.png

image.png

image.png

image.png

 

image.png

image.png

優點
只需要1個動態代理類就可以解決創建多個靜態代理的問題,避免重複、多餘代碼,更強的靈活性
動態代理的服務內容不需要像靜態代理一樣寫在每個代碼塊中,只需要寫在invoke()方法中即可,降低了代碼的冗餘度。

缺點
效率低,相比靜態代理中 直接調用目標對象方法,動態代理則需要先通過Java反射機制 從而 間接調用目標對象方法
動態代理類仍然需要實現接口。

靜態代理,動態代理測試代碼
如果喜歡請點個start

發佈了72 篇原創文章 · 獲贊 4 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章